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

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Expressions régulières, ça fonctionne ENFIN !

par PhilFree » 29 août 2005, 23:01

Merci à vous deux !

Je pense quand même qu'on peut faire un peu plus clair question tuto. Mais il est vrai que rien ne remplace l'exercice...
:wink:

par naholyr » 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:

par Ripat » 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:

par PhilFree » 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:

par PhilFree » 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 :!:

par naholyr » 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...

par PhilFree » 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

:!: :!: :!:

par naholyr » 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 :)

par PhilFree » 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 $,-,:,/,.,+

:?:

par naholyr » 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.

par Ripat » 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);

par PhilFree » 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:

par Cyrano » 27 août 2005, 22:52

Ou encore, ici: http://www.expreg.com
À ce détail près que là, on est en Javascript ;)

par JazzFinder » 27 août 2005, 19:14

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

par Cyrano » 27 août 2005, 18:51

À mon avis, tu vas trouver ton bonheur ICI