Expressions régulières, ça fonctionne ENFIN !

Eléphant du PHP | 172 Messages

27 août 2005, 18:26

Bonjour à tous,

J'aimerais remplacer toute une série de "if" par une expression régulière.

Mais ne les ayant jamais utilisées, j'ai beaucoup de peine à rédiger cette maudite expression, pourriez-vous me donner un coup de pouce ?

Voici le code que j'aimerais remplacer par une expression régulière:
// test de la validité des caractères - élimination des caractères interdits
// caractères autorisés: 0-9 A-E TN $-:/*.+ (24 caractères aut.) 
for ( i = 0 ; i < dtalgth ; i++ )  {
		tmp  = valeur.substr( i, 1 ) ;
		tmp2 = tmp.charCodeAt( 0 ) ;

		if((tmp2 >= 48) && (tmp2 <= 57)) {	//	***** [0]..[9]
				hr += tmp + " " ;
		} 	
		if( tmp2 == 36 ) {		// *****  [$]
				hr += tmp + " " ;
		}
		if( tmp2 == 45 ) {		// *****  [-]
				hr += tmp + " " ;
		}
		if( tmp2 == 58 ) {		// *****  [:]
				hr += tmp + " " ;
		}
		if( tmp2 == 47 ) {		// *****  [/]
				hr += tmp + " " ;
		}
		if( tmp2 == 46 ) {		// *****  [.]
				hr += tmp + " " ;
		}
		if( tmp2 == 43 ) { 		// *****  [+]
				hr += tmp + " " ;
		}

		if(( tmp2 == 65 ) || ( tmp2 == 84 )) {	// *****  A ou T
				hr += tmp + " " ;
		}

		if(( tmp2 == 66 ) || ( tmp2 == 78 )) {	// *****  B ou N
				hr += tmp + " " ;
		}
		if(( tmp2 == 67 ) || ( tmp2 == 42 )) {	// *****  C ou [*]
				hr += tmp + " " ;
		}
		if(( tmp2 == 68 ) || ( tmp2 == 69 )) {	// *****  D ou E
				hr += tmp + " " ;
		}
		
}
Si vous avez un lien vers un bon tutoriel concernant les expressions régulières, je suis preneur.

Merci d'avance pour votre aide.

. :wink:
Modifié en dernier par PhilFree le 29 août 2005, 18:50, modifié 4 fois.

Mammouth du PHP | 19672 Messages

27 août 2005, 18:51

À mon avis, tu vas trouver ton bonheur ICI
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 417 Messages

27 août 2005, 19:14

Ou encore, ici: http://www.expreg.com

Mammouth du PHP | 19672 Messages

27 août 2005, 22:52

Ou encore, ici: http://www.expreg.com
À ce détail près que là, on est en Javascript ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 172 Messages

28 août 2005, 11:16

Merci à vous deux !

J'ai lu les tutos, mais ce n'est vraiment pas clair.

Je crois que je préfère les "if", au moins ça fonctionne et c'est clair.

Ces expressions régulières sont vraiment mal documentées et les tutoriels sont confus.

Donc longue vie aux IF et autres switch :wink:

ViPHP
ViPHP | 1380 Messages

28 août 2005, 11:46

Ces expressions régulières sont vraiment mal documentées et les tutoriels sont confus.
Mal documenté? :shock:

Je pense qu'il y a peu d'outils qui soient utilisés dans autant de langages (Perl, PHP, ASP, MySQL, JS, Python, .Net, Java etc....)

Il y a même des possibilités d'utilisation de regex dans Word et Excel (mal implémentées mais bon...)

Même si il y a de légères différences d'implémentations, un motif de regex reste un motif de regex.

Je pense donc, au contraire, qu'il y a très peu d'outils aussi bien documenté. Il faut s'y mettre, c'est tout.

Pour ton cas, que préfères-tu: tes if successifs ou ceci (si j'ai bien compris ton problème):
$txt = preg_replace('#[0-9\$:/\.\+ATBNCDE*-]#', null, $txt);
ripat

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

28 août 2005, 11:55

Le problème est double pour toi :
- d'une part tu veux faire un remplacement, en ceci tu peux remplacer ta série de IF par une seule expression régulière en JavaScript

Code : Tout sélectionner

valeur = valeur.replace(/[\d\$\-:\.\+\*ATBNCDE]/g, "")
(note: si tu oublies le "g" à la fin, JavaScript ne remplacera que la première occurrence trouvée, je dis ça de mémoire si ça ne fonctionne pas retire-le et vérifie le résultat)
- d'une autre part tu remplis un tableau bc. Une regexp ne pourra pas le faire pour toi en JavaScript (l'option /e n'y existe pas à ma connaissance), donc si ce tableau doit impérativement être rempli, tu devras de toute façon passer par cette boucle.

Eléphant du PHP | 172 Messages

28 août 2005, 17:12

Mal documenté? :shock:
...
$txt = preg_replace('#[0-9\$:/\.\+ATBNCDE*-]#', null, $txt);
...

Code : Tout sélectionner

valeur = valeur.replace(/[\d\$\-:\.\+\*ATBNCDE]/g, "")
Merci beaucoup à vous deux pour vos réponses,

Mais, voici exactement ce que je veux dire par MAL DOCUMENTE.

Un même problème et deux solutions qui ne donnent AUCUN résultat.

Je soupçonne que Ripat l'ait écrit en PHP, mais ça ne change rien au problème.

Il faut que je chasse de toutes mes chaînes les caractères qui ne sont:
- ni 0 à 9
- ni A,B,C,D,E,T,N
- ni $,-,:,/,.,+

:?:

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

28 août 2005, 23:13

Un même problème et deux solutions qui ne donnent AUCUN résultat.
Les deux solutions sont les mêmes, il s'agit du même masque, de la même expression régulière.
Je soupçonne que Ripat l'ait écrit en PHP, mais ça ne change rien au problème.
En effet, puisque l'expression est la même dans les deux cas.
Il faut que je chasse de toutes mes chaînes les caractères qui ne sont:
- ni 0 à 9
- ni A,B,C,D,E,T,N
- ni $,-,:,/,.,+
Ce qui revient à remplacer tous les caractères 0 à 9, A, B, C, D, E, T, N, $, -, :, /, . et + par rien, soit (je réitère) en javascript valeur = valeur.replace(/[0-9ABCDETN\$\-:\/\.\+]/g, "");.

On peut difficilement faire plus simple :)

Eléphant du PHP | 172 Messages

29 août 2005, 09:49

Ce qui revient à remplacer tous les caractères 0 à 9, A, B, C, D, E, T, N, $, -, :, /, . et + par rien, soit (je réitère) en javascript valeur = valeur.replace(/[0-9ABCDETN\$\-:\/\.\+]/g, "");.

On peut difficilement faire plus simple :)
On ne peut pas faire plus simple, le HIC c'est que ça ne marche pas. :lol:

Avec:
[0-9ABCDETN\$\-:\/\.\+] il enlève de la chaîne tous les caractères autorisés et laisse les caractères interdits.

Donc j'essaye avec:
[^0-9ABCDETN\$\-:\/\.\+] et là j'ai une erreur Javascript: "unterminated character class"
(le ^ je l'ai pourtant trouvé ici http://aidejavascript.com/article65.html )

Quand je vous dit que ces Expression régulières sont MAL DOCUMENTEES

:!: :!: :!:

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

29 août 2005, 10:21

Sans doute faut-il échapper le ":". Sinon tu peux aussi faire un remplacement de chaine brute, ce sera de toute façon plus efficace...

Eléphant du PHP | 172 Messages

29 août 2005, 14:38

Sans doute faut-il échapper le ":". Sinon tu peux aussi faire un remplacement de chaine brute, ce sera de toute façon plus efficace...
Bon, ben ça me rassure, avec ces expressions régulières, je vois que vous pédalez dans la semoule tout comme moi. :wink:

Je reste donc aux IF :!:

Eléphant du PHP | 172 Messages

29 août 2005, 18:48

J'ai enfin trouvé la solution grâce à votre aide !

On peut donc remplacer ça:

Code : Tout sélectionner

// test de la validité des caractères - élimination des caractères interdits // caractères autorisés: 0-9 A-E TN $-:/*.+ (24 caractères aut.) for ( i = 0 ; i < dtalgth ; i++ ) { tmp = valeur.substr( i, 1 ) ; tmp2 = tmp.charCodeAt( 0 ) ; if((tmp2 >= 48) && (tmp2 <= 57)) { // ***** [0]..[9] hr += tmp + " " ; } if( tmp2 == 36 ) { // ***** [$] hr += tmp + " " ; } if( tmp2 == 45 ) { // ***** [-] hr += tmp + " " ; } if( tmp2 == 58 ) { // ***** [:] hr += tmp + " " ; } if( tmp2 == 47 ) { // ***** [/] hr += tmp + " " ; } if( tmp2 == 46 ) { // ***** [.] hr += tmp + " " ; } if( tmp2 == 43 ) { // ***** [+] hr += tmp + " " ; } if(( tmp2 == 65 ) || ( tmp2 == 84 )) { // ***** A ou T hr += tmp + " " ; } if(( tmp2 == 66 ) || ( tmp2 == 78 )) { // ***** B ou N hr += tmp + " " ; } if(( tmp2 == 67 ) || ( tmp2 == 42 )) { // ***** C ou [*] hr += tmp + " " ; } if(( tmp2 == 68 ) || ( tmp2 == 69 )) { // ***** D ou E hr += tmp + " " ; } }
Par ça:

Code : Tout sélectionner

// test de la validité des caractères - élimination des caractères interdits // caractères autorisés: 0-9 A-E TN $-:/*.+ (24 caractères aut.) hr = valeur.replace(/[^0-9ABCETN\$\-:\*\/\.\+]/g, "");
Quelle galère ces expressions régulières, mais ça permet d'économiser pas mal de lignes de code.
:evil:

ViPHP
ViPHP | 1380 Messages

29 août 2005, 19:41

Bon, ben ça me rassure, avec ces expressions régulières, je vois que vous pédalez dans la semoule tout comme moi.
Hum ...

Naholyr, retiens-toi! Pas sur la tête !

PS: Naholyr et moi sommes les auteurs de deux tuto sur les regex. On ne pédale plus dans la semoule. Juste un peu dans la choucroute de temps en temps. Il y a un mieux. :wink:
ripat

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

29 août 2005, 22:34

Code : Tout sélectionner

// test de la validité des caractères - élimination des caractères interdits // caractères autorisés: 0-9 A-E TN $-:/*.+ (24 caractères aut.) hr = valeur.replace(/[^0-9ABCETN\$\-:\*\/\.\+]/g, "");
Je n'avais pas compris ton algo avec les IF, pour moi c'était des caractères interdits, et tu voulais les supprimer. En effet il suffisait d'ajouter le ^ au début de la classe ;)

Tu verras, les expressions régulières (surtout en php avec preg_replace_callback et preg_grep par exemple) te permettront d'alléger tous tes traitements de chaines, et en prime de les rendre plus performants ;)
Je comprends que ça soit un peu obscur au départ, mais il faut t'accrocher ça vaut le coup. Allez viens jeune padawan, nous pouvons t'enseigner le secret de la Force Rationnelle :idea: