Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Remplacer ereg

5 réponses
Avatar
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.

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

5 réponses

Avatar
Olivier Miakinen
Bonjour,

Le 01/11/2012 20:23, Pascale a écrit :
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)



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à.

Je tente :

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) ?

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 ?

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
Avatar
Pascale
Bonjour Olivier (et les zôtres aussi !),

Olivier Miakinen <om+ écrivait
news:k6ukgq$1hdv$:

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...).

Je tente :

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.

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
$.

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 !

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
Avatar
Olivier Miakinen
Le 02/11/2012 12:41, Pascale a écrit :

Je tente :

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).

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).



Là c'est normal que ça ne fonctionne pas, il manque les slashs (/).

Quelle est cette étrange diablerie ?



Essaye donc avec :
if (!preg_match('/^[a-zA-Z0-9]{5,8}$/', $mdp))


Cordialement,
--
Olivier Miakinen
Avatar
Pascale
Olivier Miakinen <om+ écrivait
news:k70t3r$2udn$:

!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).



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...)

Quelle est cette étrange diablerie ?



Essaye donc avec :
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
Avatar
Olivier Miakinen
Le 05/11/2012 09:33, Pascale a écrit :

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



Et ça naturellement, ça marche !



Alors c'est bien. Bonne continuation !

Cordialement,
--
Olivier Miakinen