Discussion:
Remplacer ereg
(trop ancien pour répondre)
Pascale
2012-11-01 19:23:50 UTC
Permalink
PHP5.3 semble ne pas aimer du tout les ereg. Je suis donc en train de
tenter de remplacer mes ereg par des preg_match(_all ?).
Le but est de vérifier qu'un mot de passe contient entre 5 et 8 caractères,
et seulement des caractères alphanumériques.

J'avais :
if (!ereg("[A-Za-z0-9]{5,8}",$mdp))
... (message d'erreur)

Je tente :

if (!preg_match_all("/^[a-zA-Z0-9]{5,8}$/",$mdp))

... (message d'erreur)

Et naturellement cela ne fonctionne pas, aucun mot de passe ne semble
accepté.

Je me doute bien que ma regexp est mal écrite, mais je ne suis pas capable
de trouver ce qui ne va pas...
--
Pascale
http://www.la-grille-verte.net
Olivier Miakinen
2012-11-01 20:03:17 UTC
Permalink
Bonjour,
Post by Pascale
PHP5.3 semble ne pas aimer du tout les ereg. Je suis donc en train de
tenter de remplacer mes ereg par des preg_match(_all ?).
Le but est de vérifier qu'un mot de passe contient entre 5 et 8 caractères,
et seulement des caractères alphanumériques.
if (!ereg("[A-Za-z0-9]{5,8}",$mdp))
... (message d'erreur)
Cette regexp n'étant pas ancrée au début et à la fin, elle vérifie
juste que la chaîne *contient* une sous-chaîne d'au moins 5 caractères
alphanumériques, pas qu'il n'y a que ces caractères-là.
Post by Pascale
if (!preg_match_all("/^[a-zA-Z0-9]{5,8}$/",$mdp))
... (message d'erreur)
Ici, tu l'as ancrée (^ et $), du coup tu es sûre de ne trouver qu'une
seule occurrence au maximum, et donc un preg_match suffirait.

Cela dit, ça devrait fonctionner si vraiment la chaîne ne contient
rien d'autre que les 5 à 8 caractères alphanumériques. Es-tu sûre
qu'il n'y a pas autre chose, par exemple une espace ou un saut de
ligne (\n) ?
Post by Pascale
Et naturellement cela ne fonctionne pas, aucun mot de passe ne semble
accepté.
Est-ce que ça marche en retirant le ^ et le $ ? Inversement, est-ce
que l'ereg continue à fonctionner en les ajoutant ?
Post by Pascale
Je me doute bien que ma regexp est mal écrite, mais je ne suis pas capable
de trouver ce qui ne va pas...
Elle n'est pas forcément mal écrite, c'était peut-être celle d'avant
qui n'était pas suffisamment stricte. Fais les essais ci-dessus pour
voir.

Cordialement,
--
Olivier Miakinen
Pascale
2012-11-02 11:41:31 UTC
Permalink
Bonjour Olivier (et les zôtres aussi !),
Post by Olivier Miakinen
Cette regexp n'étant pas ancrée au début et à la fin, elle vérifie
juste que la chaîne *contient* une sous-chaîne d'au moins 5 caractères
alphanumériques, pas qu'il n'y a que ces caractères-là.
Oui, elle laissait passer à peu près tout et n'importe quoi (maintenant je
comprends pourquoi...).
Post by Olivier Miakinen
Post by Pascale
if (!preg_match_all("/^[a-zA-Z0-9]{5,8}$/",$mdp))
... (message d'erreur)
Ici, tu l'as ancrée (^ et $), du coup tu es sûre de ne trouver qu'une
seule occurrence au maximum, et donc un preg_match suffirait.
Cela dit, ça devrait fonctionner si vraiment la chaîne ne contient
rien d'autre que les 5 à 8 caractères alphanumériques. Es-tu sûre
qu'il n'y a pas autre chose, par exemple une espace ou un saut de
ligne (\n) ?
Normalement il n'y a rien d'autre : le mot de passe est passé par un
formulaire (méthode post), et avant d'être vérifié, je fais dessus un trim,
puis un strip_tags.
Je viens donc de remplacer preg_match_all par preg_match, et je ne peux
toujours rentrer aucun mot de passe, pas même un bête aaaaaa.
Post by Olivier Miakinen
Est-ce que ça marche en retirant le ^ et le $ ?
Non. preg_match ne fonctionne pas non plus, que ce soit avec ou sans ^ et
$.
Post by Olivier Miakinen
Inversement, est-ce que l'ereg continue à fonctionner en les ajoutant ?
Oui, et elle semble fonctionner correctement, filtrant les caractères non
alpha-numériques et acceptant ceux-ci. Je sais que c'est une syntaxe
« dépréciée », donc j'aurais bien voulu passer à preg_match, mais je n'y
parviens pas !
Post by Olivier Miakinen
Elle n'est pas forcément mal écrite, c'était peut-être celle d'avant
qui n'était pas suffisamment stricte. Fais les essais ci-dessus pour
voir.
Donc j'arrive à faire quelque chose qui marche avec l'ancienne syntaxe ereg
(améliorée), mais pas avec preg_match.
En résumé :
!ereg('^[A-Za-z0-9]{5,8}$',$mdp) fonctionne mais

!preg_match('^[a-zA-Z0-9]{5,8}$',$mdp) ne fonctionne pas, pas plus que :
!preg_match_all('[a-zA-Z0-9]{5,8}',$mdp).

Quelle est cette étrange diablerie ?
--
Pascale
http://www.la-grille-verte.net
Olivier Miakinen
2012-11-02 16:41:08 UTC
Permalink
Post by Pascale
Post by Pascale
if (!preg_match_all("/^[a-zA-Z0-9]{5,8}$/",$mdp))
... (message d'erreur)
Comme déjà dit, ceci devrait fonctionner (quoique je conseillerais
plutôt preg_match que preg_match_all).
Post by Pascale
!preg_match_all('[a-zA-Z0-9]{5,8}',$mdp).
Là c'est normal que ça ne fonctionne pas, il manque les slashs (/).
Post by Pascale
Quelle est cette étrange diablerie ?
Essaye donc avec :
if (!preg_match('/^[a-zA-Z0-9]{5,8}$/', $mdp))


Cordialement,
--
Olivier Miakinen
Pascale
2012-11-05 08:33:41 UTC
Permalink
Post by Olivier Miakinen
Post by Pascale
!preg_match_all('[a-zA-Z0-9]{5,8}',$mdp).
Là c'est normal que ça ne fonctionne pas, il manque les slashs (/).
Ou : comment je réussis à faire une bêtise en tentant d'en ôter une autre
(j'ai remplacé effectivement les " par des ' sans slashes... Si c'est pas
du talent à l'état pur, ça...)
Post by Olivier Miakinen
Post by Pascale
Quelle est cette étrange diablerie ?
if (!preg_match('/^[a-zA-Z0-9]{5,8}$/', $mdp))
Et ça naturellement, ça marche !

Je te remercie pour ton aide efficace... et ta patience !
--
Pascale
http://www.la-grille-verte.net
Olivier Miakinen
2012-11-06 19:05:41 UTC
Permalink
Post by Olivier Miakinen
if (!preg_match('/^[a-zA-Z0-9]{5,8}$/', $mdp))
Et ça naturellement, ça marche !
Alors c'est bien. Bonne continuation !

Cordialement,
--
Olivier Miakinen
Loading...