Javascript et expressions régulières.

Résolu/Fermé
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 - 9 juil. 2020 à 12:30
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 - 9 juil. 2020 à 18:24
Bonjour,

Je bloque sur la syntaxe d'une expression régulière sous javascript.

Je me suis fait une fonction qui teste, avec une expression régulière, le format d'une date. La voici :
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Teste le format d'une date (JJ/MM/AAAA ou MM/JJ/AAAA).
function isDate(date) {
	var date, reg = new RegExp("^[0-9]{2}[/]{1}[0-9]{2}[/]{1}[0-9]{4}$","g");
	if(reg.test(date)) { return true; } else { return false; }
}

Ce qui veut dire :
- 2 chiffres de 0 à 9 (
[0-9]{2}
)
- 1 fois le caractère slash (
[/]{1}
)
- encore 2 chiffres de 0 à 9 (
[0-9]{2}
)
- encore 1 fois le caractère slash (
[/]{1}
)
- et 4 chiffres de 0 à 9 (
[0-9]{4}
)
- NB :
^
= au début,
$
= à la fin

Je suis en train de rédiger une classe PHP (mais ma question n'a rien à voir avec le PHP) qui écrira le javascript permettant de choisir l'expression régulière en fonction du TDL (Top Level Domain, i.e. le pays --fr,de,es,it,etc.--) car le format des dates varie selon les pays.

- Pour un certain nombre de pays, dont la France, le format des dates est JJ/MM/AAAA et avec cette expression régulière, le 2 juillet de cette année devra être saisi comme : 02/07/2020
- Pour d'autres pays comme l'Allemagne cette date (au format J.M.AA.) pourra être écrite telle que 2.7.20 et Noël de cette année (toujours en Allemagne) s'écrirait 25.12.20

Ceci revient à dire que pour les mois et les jours, il peut y avoir indifféremment 1 ou 2 chiffres.

Ma question : Pour les jours ou les mois du format français (JJ/MM), je peux imposer la saisie de deux chiffres (
[0-9]{2}
) mais pour le cas de l'Allemagne, je ne sais pas comment indiquer que la saisie peut être effectuée indifféremment avec 1 ou 2 chiffres (
[0-9]{????}
)

Quelqu'un a-t-il la solution ?
Merci pour votre aide.

Configuration: Windows / Firefox 52.0

1 réponse

jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 4 649
9 juil. 2020 à 14:08
Bonjour

En mettant 1,2 dans les accolades.

Mais je pense que tu te compliques la vie.
Regarde donc la librairie moment.js

1
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 137
Modifié le 9 juil. 2020 à 18:28
Merci pour ta réponse.

Je vais choisir plutôt la solution {1,2} plutôt que moment.js (que peut-être, et même probablement, j'utiliserai à titre perso). Mais la classe PHP que j'écris a pour but d'écrire tout le javascript nécessaire (la fonction verif() : onsubmit="return verif()" et celles dont elle a besoin) à la vérification d'un formulaire qui aura été décrit dans un fichier .ini

Si le formulaire s'appelle adhésion (name="adhesion") le fichier de description sera adhesion.ini et le contenu de celui-ci pourrait ressembler à quelque chose comme ça :

# Formulaire d'adhésion
#
[form]
name=adhesion

[general]
ctrydate=fr

[fields]
; fieldname,labelname,fieldtype,obligatory(1) or not(0),lgmin,lgmax,valmin,valmax
; les "typefield" sont propre à la classe (text,num,date,mail,hour4,hour6) = type="text" en html
; type hour4: HH:MN
; type hour6: HH:MN:SS
fname,First name,text,1,2,25
lname,Last name,text,0,2,25
price,Selling price,num,0,1,6,1,999.99
bdate,Birthdate,date,1
mail,Mail address,mail,1,6,60
dept,Department,list,1
tel,Phone number,text,0,1,15
sex,Sex,radio,1
study,Study level,radio,1
judo;volley;ski;athl,Sports,checkbox,1
h4,Hour,hour4,1
h6,Hour,hour6,1
ok,Validation,valid,1

[chars]
lname=letters + " -'"
fname=letters + " -'"
price=digits + ",."
tel=digits + ". "
comment=ascii + letters + digits + "@,;:?./\"'!%£\$€ ()=*-+"
mail=ascii + digits + "@_-+.@"


La classe PHP a pour objet de lire ce fichier INI et d'écrire tout le javascript permettant d'effectuer la vérification de ce formulaire, et la vérification des champs date dépend naturellement de la valeur qui est inscrite dans
$ini["general"]["ctrydate"]
, les formats date étant différents selon les pays. La classe peut être incluse dans la page et instanciée quand on en a besoin pour générer le javascript nécessaire ou elle peut être utilisée à part pour produire le javascript qu'on aura plus qu'à Copier/Coller dans la page ; ce sera au choix de l'utilisateur mais je ne veux pas être dépendant de librairies. Je fournis la classe (= un seul fichier), la personne décrit son formulaire et les vérifications souhaitées, point-barre. Pas de choses à télécharger ni à installer en plus. En revanche pour mes besoins propres, je vais regarder moment.js car tu as toujours été de bon conseil.

Mais pour l'instant, je règle la production du javascript de vérification des dates pour que la génération du code javascript de vérification de celles-ci corresponde au format du pays indiqué et ta réponse m'aide déjà beaucoup, ce dont je te remercie.

On peut continuer à discuter, si tu veux, mais je marque la question comme résolue.
0
jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 4 649 > heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023
9 juil. 2020 à 18:13
Les fichier INI sont plus là pour faire de la configuration ( à l'origine sous dos / windows..)
En plus, ton fichier ini n'est pas vraiment valide...
Un fichier INI c'est : Section / Cle / Valeur

[SECTION]
unecle=unevaleur


Quite à faire un fichier de paramétrage, utilise le format JSON
0
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 137 > heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023
9 juil. 2020 à 18:24
J'avais d'ailleurs déjà écrit cette classe JS ci-dessous pour le formatage d'une date selon le pays. Cette fois-ci il ne s'agit pas du formatage mais de générer les fonctions JS pour la vérification de la validité de la date (pas de 32/03/2020 ni de 25/13/2020 quelque soit le format de la date).
Bonne soirée et merci.
Bye.

/*
   Cette extension de l'objet Javascript Date est écrite selon les indications trouvées sur
   Wikipedia à l'URL https://fr.wikipedia.org/wiki/Date
   Peut-être certaines erreurs peuvent être trouvées (certains norvégiens utilisent le format
   d.m.Y (j.m.A) tandis que d'autres utilisent d/m-y (j/m-a))
   Mais le problème, si tant est qu'il y ait un problème, n'est pas là.
   Le principal intérêt dans cette extension est de pouvoir facilement modifier ou ajouter un
   nouveau format. Les jours, mois et années sont disponibles avec les variables d, D, m, M,
   y, Y et vous pouvez modifier ou ajouter un nouveau format avec la déclaration 'switch()'.
   Le tableau f (pour format) contient plusieurs lignes de tld (Top Level Domain où chaque
   ligne contient les tld des pays ayant le même format date.
   Pour ajouter un nouveau format: Ajouter une nouvelle ligne au tableau f et ajoutez un 'case'
   à l'instruction switch() pour retourner une valeur utilisant les valeurs correctes de jour,
   mois, année, correctement séparés.
   Pour modifier un format: changer le tld à modifier pour le placer dans la ligne correcte du tableau f
 
   https://fr.wikipedia.org/wiki/Date :
   D/M/A : al,ar,au,at,be,bo,br,bg,ca,cl,co,hr,es,ee,ec,fr,gr,gy,hk,in,ie,il,it,lv,mo,ma,mx,nz,py,nl,pl,pt,pe,ro,gb,ru,do,cz,sg,sk,si,th,tr,uy,ve
   D.M.A : ch,ua,
   D/M-A : dk,no,se
   M-D-A : usa
   A-M-D : za,sa,am,az,bh,cn,cy,kr,dj,ae,er,hk,iq,ir,il,jp,jo,kw,lb,ly,lt,om,qa,sy,tw,ye,mysql
   A.M.D : hu
   d.m.A : de,fi
   AMD   : iso
*/
Date.prototype.Format=function(tld) {

	var tld, d, D, m, M, y, Y, f, n;
	
	if(!tld) { tld = 'fr'; }    // Default value
	
	// Days   : d = 1..31 ; D = 01..31 
	// Months : m = 1..12 ; M = 01..12
	// Years  : y = 14    ; Y = 2014
	d = this.getDate()*1;
	D = (d<10) ? '0'+d : d;
	m = this.getMonth()+1;
	M = (m<10) ? '0'+m : m;
	Y = ''+this.getFullYear();
	y = Y.substr(2,2);

	f = new Array(
	/* 0 */	'al,ar,au,at,be,bo,br,bg,ca,cl,co,hr,es,ee,ec,fr,gr,gy,hk,in,ie,il,it,lv,mo,ma,mx,nz,py,nl,pl,pt,pe,ro,gb,ru,do,cz,sg,sk,si,th,tr,uy,ve',
	/* 1 */	'ch,ua',
	/* 2 */	'dk,no,se',
	/* 3 */	'usa',
	/* 4 */	'za,sa,am,az,bh,cn,cy,kr,dj,ae,er,hk,iq,ir,il,jp,jo,kw,lb,ly,lt,om,qa,sy,tw,ye,mysql',
	/* 5 */	'hu',
	/* 6 */	'de,fi,eu',
	/* 7 */	'iso'
		);
		
	n = 0;
	while(f[n].indexOf(tld.toLowerCase()) < 0){ n++; } // search the line where tld is in it
	
	switch(n){
		case 0: return D+'/'+M+'/'+Y; break; // al, ar, au, ...
		case 1: return D+'.'+M+'.'+Y; break; // ch, ua ...
		case 2: return D+'/'+M+'-'+y; break; // dk, no, se ...
		case 3: return M+'-'+D+'-'+y; break; // usa
		case 4: return Y+'-'+M+'-'+D; break; // za, sa, am ...
		case 5: return Y+'.'+M+'.'+D; break; // hu
		case 6: return d+'.'+m+'.'+Y; break; // de, fi ...
		case 7: return Y+M+D;         break; // iso
	}
};
0