8795 sujets

Développement web côté serveur, CMS

Bonjour,

J'aimerais tester la validité d'une chaine de caractères selon les conditions suivantes:
- Il faut que la chaine contienne au moins une voyelle
- Il faut que la chaine ne contienne pas deux lettres consécutives identiques

J'aimerais faire cette opération avec une regex a moins qu'il y ait quelque chose de plus performant.

Merci de votre aide
Modifié par ashesheart (22 Apr 2010 - 12:10)
Bonjour,

Voilà avec preg_match

([aeiouy])
(aa|bb|cc|dd|ee|ff|gg|hh|ii|jj|kk|ll|mm|nn|oo|pp|qq|rr|ss|tt|uu|vv|ww|xx|yy|zz)


Mais comme tu vois c'est facile de faire ça avec strpos. Et donc plus rapide.
masseuro a écrit :
Bonjour,

Voilà avec preg_match

([aeiouy])
(aa|bb|cc|dd|ee|ff|gg|hh|ii|jj|kk|ll|mm|nn|oo|pp|qq|rr|ss|tt|uu|vv|ww|xx|yy|zz)


Mais comme tu vois c'est facile de faire ça avec strpos. Et donc plus rapide.


Le problème est qu'avec strpos il faut parcourir la chaine non ?

En terme de performance, il vaut mieux utiliser une regex ou parcourir la chaine et tester avec strpos ?

Merci pour votre aide.
Au passage, inutile d'écrire une longue liste d'alternatives du genre aa|bb|cc|dd...|zz. ON peut simplifier par ([a-z])\1. IL y a une parenthèse capturante en plus, mais dans le cadre d'un preg_match on s'en fout.
@QuentinC: si je comprends bien lorsque l'on fait [a-z]\1 cela signifie que l'on n'autorise qu'une seule occurence de a...z. Cela bloque donc lorsque l'on écrit baobabb mais cela fonctionne si on écrit par exemple baobab ?

Merci
Modifié par ashesheart (21 Apr 2010 - 17:18)
déjà les parenthèses sont importantes. elles permettent d'utiliser \1.

en fait \1 va récupérer la valeur de la première parenthèse de ton expression.

([a-z])\1 ça matche aa ou bb ou cc , etc...

ça ne va pas eliminer baobabb


( edit avertissement : s'il y a 2 blancs dans mes expressions en fait y a un [ et un ] autour de uyaeio mais l'editeur d'alsa bug )


soit tu fais 2 tests ( et là tous les fans de regexp vont me dire houhou pourtant c'est bien simple )

1 pour savoir si ça commence par une voyelle : preg_match (/^ Smiley uyaeio /,$str) rend 1
2 que tu ne matches pas les doublons : preg_match (/([a-z])\1/,$str) rend 0

soit 1 seul test ... ...
bon ben là c'est plus dur j'ai un peu galeré.

en partant de l'idée qu'une chaine comportant des chiffres est accepté ( d'aprés ton énoncé initial oui ) sinon ça se complique encore.

je propose ça
preg_match ('/^[uyaeio](?!.*([a-z])\1)/',$str); 




en se basant sur le motif (?! ) : la prospection négative. apparemment c'est un motif non capturant. je l'ai découvert a l'instant Smiley smile

c'est juste un essai, y a peut-être mieux

Bon courage.
Modifié par CPascal (22 Apr 2010 - 00:44)
Pour ce qui est des chiffres, le scénario de base était:

- Remplacer tous les chiffres et caractères spéciaux par des espaces
- Transformer la chaine en majuscule
- Tester qu'il n'y ait pas deux lettres consécutives
- Tester qu'il y ait au moins une voyelle.

Les regex c'est pas mon dada c'est pour cela que je demande de l'aide.

Je vais tester vos propositions et vous tient au courant.
Fais-le en autant d'étapes différentes que ce que tu énumères, ce sera beaucoup plus simple.

- Remplacer tous les chiffres et caractères spéciaux par des espaces
Pas besoin de regexp. strtr sera sûrement plus rapide.

- Transformer la chaine en majuscule
strtoupper

- Tester qu'il n'y ait pas deux lettres consécutives
Expliqué ci-dessus

- Tester qu'il y ait au moins une voyelle.
Facile, mais il n'y a pas besoin de regexp pour ça. strpbrk
Modifié par QuentinC (22 Apr 2010 - 10:22)