OVH Cloud OVH Cloud

RegExp qui marche une fois sur deux.

7 réponses
Avatar
Thierry
Bonjour,

Pour valider un champs contenant une IP, j'utilises ce code :

alert("'" + IP + "'");

var regExpIpAdress=/\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]
|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/g;
if (regExpIpAdress.test(IP) == false) {
alert("IP '" + IP + "' non valide");
return;
}


Quand j'appelle ce code la premiere fois, il affiche la bonne IP et l'alert
pour dire qu'elle n'est pas valide.
Quand j'appelle ce code une seconde fois, il affiche la même bonne IP et le
test réussi...

Une idée ?

7 réponses

Avatar
O.L.
Bonjour,

Pour valider un champs contenant une IP, j'utilises ce code :

alert("'" + IP + "'");

var regExpIpAdress=/b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(25[0-5]
2[0-4][0-9]|[01]?[0-9][0-9]?)b/g;
if (regExpIpAdress.test(IP) == false) {

alert("IP '" + IP + "' non valide");
return;
}


Quand j'appelle ce code la premiere fois, il affiche la bonne IP et l'alert
pour dire qu'elle n'est pas valide.
Quand j'appelle ce code une seconde fois, il affiche la même bonne IP et le
test réussi...

Une idée ?


T'es sûr que c'est bien .test() pour tester la conformité d'un texte à
un regexp ?

--
Olivier Ligny
Créateur web free-lance / www.cyber-tamtam.net


Avatar
Thierry
O.L. écrivait
news::

T'es sûr que c'est bien .test() pour tester la conformité d'un texte à
un regexp ?


Heu.. oui. Ca marche bien pour tester l'adresse MAC en tout cas.

Avatar
O.L.
O.L. écrivait
news::

T'es sûr que c'est bien .test() pour tester la conformité d'un texte à
un regexp ?


Heu.. oui. Ca marche bien pour tester l'adresse MAC en tout cas.


Bon, j'ai essayé moi aussi, et effectivement ça ne renvoie pas le même
résultat une fois sur deux, que ce soit avec exec(), search(), ou
test() ...
Par contre si on ne crée pas d'objet RegExp, et qu'on met le pattern
dans la fonction elle même, là ça marche tout le temps :

<script>

IP = "123.125.122.111";

function checkIP(IP) {
if
(/b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(25[0-5]2[0-4][0-9]|[01]?[0-9][0-9]?)b/g.exec(IP)
== null)
alert("IP '" + IP + "' non valide :(");
else
alert("IP valide :)");
}

checkIP(IP);
checkIP(IP);
checkIP(IP);

</script>

@+

--
Olivier Ligny
Créateur web free-lance / www.cyber-tamtam.net


Avatar
Thierry
O.L. écrivait
news::

Bon, j'ai essayé moi aussi, et effectivement ça ne renvoie pas le même
résultat une fois sur deux, que ce soit avec exec(), search(), ou
test() ...
Par contre si on ne crée pas d'objet RegExp, et qu'on met le pattern
dans la fonction elle même, là ça marche tout le temps :


C'est quand même curieux cette histoire...
T'as testé avec quel browser ? Moi le dernier Firefox.

Avatar
O.L.
O.L. écrivait
news::

Bon, j'ai essayé moi aussi, et effectivement ça ne renvoie pas le même
résultat une fois sur deux, que ce soit avec exec(), search(), ou
test() ...
Par contre si on ne crée pas d'objet RegExp, et qu'on met le pattern
dans la fonction elle même, là ça marche tout le temps :


C'est quand même curieux cette histoire...
T'as testé avec quel browser ? Moi le dernier Firefox.


J'ai testé ton code et le mien sous IE6.
A mon avis, lorsque l'on crée un objet RegExp, une de ses propriétés
change à chaque fois qu'on l'utilise, ce qui donne des résultats
inattendus. Sans doute qu'à chaque fois qu'on lui fait trouver
l'occurence de A dans B, il se met à jour pour être prêt à chercher
l'occurence suivante.

Voici ce que dit ma doc :


exec
A RegExp method that executes a search for a match in a string. It
returns an array of information.

test
A RegExp method that tests for a match in a string. It returns true or
false.

match
A String method that executes a search for a match in a string. It
returns an array of information or null on a mismatch.

search
A String method that tests for a match in a string. It returns the
index of the match, or -1 if the search fails.

replace
A String method that executes a search for a match in a string, and
replaces the matched substring with a replacement substring.

split
A String method that uses a regular expression or a fixed string to
break a string into an array of substrings.


When you want to know whether a pattern is found in a string, use the
test or search method; for more information (but slower execution) use
the exec or match methods. If you use exec or match and if the match
succeeds, these methods return an array *and update properties* of the
associated regular expression object and also of the predefined regular
expression object, RegExp. If the match fails, the exec method returns
null (which converts to false).

--
Olivier Ligny
Créateur web free-lance / www.cyber-tamtam.net


Avatar
Thierry
O.L. écrivait
news::

Bon, j'ai essayé moi aussi, et effectivement ça ne renvoie pas le même
résultat une fois sur deux, que ce soit avec exec(), search(), ou
test() ...


Ca marche bien tel quel si j'ote l'option "g"...

Avatar
O.L.
O.L. écrivait
news::

Bon, j'ai essayé moi aussi, et effectivement ça ne renvoie pas le même
résultat une fois sur deux, que ce soit avec exec(), search(), ou
test() ...


Ca marche bien tel quel si j'ote l'option "g"...


Haha, alors ça doit être ça l'option qui spécifie si l'on recherche
toutes les occurences les unes après les autres (=> bug) ou bien une
seule fois (=> résultat invariant) ...

--
Olivier Ligny
Créateur web free-lance / www.cyber-tamtam.net