probleme pour valider une chaine

Eléphant du PHP | 138 Messages

24 févr. 2006, 13:00

Salut,

J'ai besoin de valider une chaine voici le principe

$logvalidate='login'.'[0-9]{3}'.'ext';
if (($login==$logvalidate) && ($password=='pass')){
Je voudrais en faite avoir 2 parties fixes et une partie variable
par ex.

login333ext ou login 123ext puisse fonctionner
je supose que ma syntaxe est incorrect mais je ne vois vraiment pas comment faire.

Merci de votre aide

Mammouth du PHP | 19672 Messages

24 févr. 2006, 13:26

utilise preg_match et une expression régulière PCRE:
<?php
$loginvalidate = "#(?:login)\s?\d{3}(?:ext)#i";
if (preg_match($loginvalidate, $login) && ($password=='pass'))
{
    //...
}
?>
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 312 Messages

24 févr. 2006, 13:34

il y a un intérêt à faire (?: à la place de ( quand on se soucie pas de faire de la capture ? A partir du moment où on ne récupère pas les captures dans un tableau ça ne devrait rien changer mais, ça se trouve ça accélère encore plus la commande de lui préciser que non, non, on veut pas faire de capture...

Mammouth du PHP | 19672 Messages

24 févr. 2006, 13:47

En faisant le test sur le testeur REGEX de Ripat pour comparer les deux, le résultat est le suivant:
Avec parenthèses non capturantes:
Motif#1 preg_match
#(?:login)\s?\d{3}(?:ext)#

Durée: 3.2901763916016E-05 sec. (100 %)

login123ext
Avec parenthèses capturantes:
Motif#2 preg_match
#(login)\s?\d{3}(ext)#

Durée: 3.504753112793E-05 sec. (107 %)

login123ext
C'est vraiment mineur comme différences, surtout que c'est du niveau de la microseconde, mais les parenthèses non capturantes rendre le traitement un poil plus rapides.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 505 Messages

24 févr. 2006, 14:36

Ca semble douteux comme calcul...

Résultats Timing sur 200 itérations ou sur 1 itérations

Code : Tout sélectionner

Motif#1 preg_match_all #(login)\s?\d{3}(ext)# Durée: 0.0031609535217285 sec. (106 %)

Code : Tout sélectionner

Motif#2 preg_match_all #(login)\s?\d{3}(ext)# Durée: 0.0029830932617188 sec. (100 %)
La première est toujours plus lente...

Ceci étant dis, je ne vois pas l'interet de capturer des chaines fixes dans le cas present...

Résultats Timing sur 200 itérations et je met ma proposition en 1 pour etre pénalisé...

Code : Tout sélectionner

Motif#1 preg_match_all #login\s?\d{3}ext# Durée: 0.0019588470458984 sec. (100 %)

Code : Tout sélectionner

Motif#2 preg_match_all #(login)\s?\d{3}(ext)# Durée: 0.0031490325927734 sec. (161 %)

Eléphant du PHP | 138 Messages

24 févr. 2006, 15:06

c'est impec ca fonctionne

Merci :)

Je ne connaissais pas cette fonction :lol: