View Full Version : Exprimer une chaîne éliminatoire dans une expressions rationnelles
KnuX
11 novembre 2005, 22h18
Salut tout le monde :)
Cela fait maintenant longtemps que je cherche à faire une expression rationnelle sans succès.
Le principe est relativement simple, je voudrais qu'elle retourne vrai lorsqu'une URL (http://.../) ne contient pas une chaîne tel qu'un domaine précis.
Par exemple, je souhaite exclure le domaine "plouf", dans ce cas :
- http://www.toto.fr/ => vrai
- http://toto.tata.net/ => vrai
- http://www.plouf.tk/ => faux
Je ne trouve pas comment faire... Je sais faire la négation d'un ensemble (le ^ en première position dans une [classe]), mais pas indiquer que je veux 0 occurence de la chaîne "plouf". (plouf){0} ne marche pas, bien entendu ;)
Merci d'avance à celui qui aura une idée de génie :rolleyes:
Cougar
11 novembre 2005, 22h43
je suppose que c'est du php ?
Après une ptite recherche :
Utilisation de la fonction strpos()
La fonction strpos() permet de connaitre la position de la première occurence d'une chaine contenu dans une autre chaine. Toutefois comme le premier caractère d'une chaine à pour numéro d'ordre 0 et non 1, se pose le problème de la différenciation entre une chaine contenant la chaine recherchée en début (donc la fonction retourne 0) et une chaine ne contenant pas la chaine recherchée. La syntaxe suivante est donc incorrecte.
$POS=strpos($ChercheDans,$LaChaine,$Apartir_du_Caract._n°);
if ($POS==0):
.....
Endif;
La fonction ne peut renvoyer 0 (valeur généralement utilisée en retour pour signaler un echec) puisque cette valeur 0 correspond justement à la position réelle du 1er caractère. Aussi PHP retourne une chaine de caractère contenant 'false' si la recherche échoue, et une valeur numérique si elle a aboutie (la chaine recherchée est trouvée dans la chaine principale). Pour obtenir un test correct il faut donc tester le type de la valeur retournée avant de poursuivre les traitements :
$POS=strpos($ChercheDans,$LaChaine,$Apartir_du_Caract._n°);
if (!is_string($POS)):
// Cette syntaxe est correcte. On n'entre dans
// la boucle que si la valeur retournée
// est une valeur numérique.
.....
Endif;
Une autre astuce, s'il s'agit simplement de vérifier l'existence d'une sous-chaine dans une chaine, donc qu'aucun traitement sur la chaine principale n'est conditionnée par la position de la sous-chaine (comme couper la chaine à partir de la sous-chaine), et que par ailleurs on ne souhaite pas utiliser les fonctions EREG_xxx basées sur les expressions régulières :
IF (strpos(" ".$ChercheDans,$LaChaine,$Apartir_du_Caract._n°) >0) :
// Notez l'espace ajouté au début de
// la chaine. Ainsi sauf si la sous-chaine commence
// également par un espace, la condition n'est
// vérifiée effectivement que si la
// la sous-chaine est trouvée et ce sans avoir
// tester le type de la valeur renvoyée.
...
KnuX
11 novembre 2005, 23h09
Non il ne s'agit pas de PHP et en fait je suis restreint à une seule expression régulière. Donc pas de "if" et autres tests avant de retourner le résultat, c'est la regexp qui est décisive :confused:
SantX
12 novembre 2005, 01h29
M'exerçant depuis déjà quelque temps au regex, c'est une chose que j'ai moi aussi cherché à faire et pour laquelle je n'ai pas encore trouvé la solution :(
Si jamais une bonne âme pouvait nous éclairer :D ...
Samva
12 novembre 2005, 10h48
J'ai tripatouiller un peu la chose hier soir et j'avoue que je n'ai rien trouvé, je vais continuer à chercher...
JoE
12 novembre 2005, 15h24
Merci d'avance à celui qui aura une idée de génie
Heu ça:
^(?:(?!plouf).)*$\r?\n?
J'ai tout bon ?????
the5thorseman
12 novembre 2005, 17h43
Heu ça:
^(?:(?!plouf).)*$\r?\n?
J'ai tout bon ?????
Pas mieux... j'ai jamais rien compris à tout ces trucs de programmation, bon j'ai jamais appris non plus mais ca donne pas envie d'apprendre :D...
(ceci n'est pas un pourrissage de post caché, bon courage dans tes recherches ;) )
KnuX
12 novembre 2005, 18h37
Merci JoE, on est sur la bonne voie ;)
"^.*(www.|http://|ftp://)(?:(?!plouf.com).)*$" a l'air d'aller bien qu'il laisse passer des trucs du style "http://www.toto.com/bidule?machin=plouf.com"
En tout cas pour ce que je fais ça va me suffir, si quelqu'un a une optimisation en vue je suis toujours preneur ! :)
Cougar
13 novembre 2005, 22h58
Qui a inventé ce langage de taré ? :D
the5thorseman
13 novembre 2005, 23h10
Attendez 5 min... J'ai un gros doute....
...ce que JoE a dit c'était une connerie ou c'était vraiment une réponse au sujet??? :confused::confused::confused:
Spycam
13 novembre 2005, 23h28
Qui a inventé ce langage de taré ? :D
Ca peut vite devenir horrible à partir d'un certain nombre de critères matchés.
Pour l'anecdote, voici ce que peut donner la validation d'une adresse mail en regexp d'après la RFC822
(http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html) :rolleyes: :p
1for-matik
13 novembre 2005, 23h30
Ca peut vite devenir horrible à partir d'un certain nombre de critères matchés.
Pour l'anecdote, voici ce que peut donner la validation d'une adresse mail en regexp d'après la RFC822
(http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html) :rolleyes: :pAhahahahaha elle est marrante celle là :confused:
KnuX
19 décembre 2005, 21h46
En ces vacances de fin d'année, je me remet aux quelques trucs laissés en suspend...
Donc en fait, ce que je veux faire c'est filtrer toute URL n'étant pas celle du domaine autorisé, soit "plouf.com".
Pour le moment j'ai l'expression : "^.*((www.|http://|ftp://)(?:(?!plouf.com).))*$"
Elle me cause néanmoins un soucis, voir cet exemple :
- Code : [regexp "^.*(www.|http://|ftp://)(?:(?!plouf.com).)*$" "www.toto.com www.plouf.com"]
- Valeur retournée : 0
Si une URL contenant mon domaine est en fin de ligne, le résultat du test regexp sera toujours 0 malgré le "www.toto.com" du début...
Qui peut voler à mon secours ? :o
SantX
19 décembre 2005, 22h16
Est-ce que ceci pourrait aider le sieur KnuX ?
(www.|http://|ftp://)(?:(?!(plouf.com| )).)+
J'espère avoir bien cerné ce que tu voulais ;)
KnuX
19 décembre 2005, 22h39
Comme vu sur IRC, non ;)
vBulletin® v3.7.3, Copyright ©2000-2008, Jelsoft Enterprises Ltd.