Communauté Informatique NDFR.net

Communauté Informatique NDFR.net (http://www.ndfr.net/forums/index.php)
-   Programmation (C/C++, Delphi, VB, etc.) (http://www.ndfr.net/forums/forumdisplay.php?f=64)
-   -   Exprimer une chaîne éliminatoire dans une expressions rationnelles (http://www.ndfr.net/forums/showthread.php?t=6826)

KnuX 11-11-2005 22:18

Exprimer une chaîne éliminatoire dans une expression rationnelle
 
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-11-2005 22:43

je suppose que c'est du php ?
Après une ptite recherche :

Code:

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-11-2005 23:09

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-11-2005 01:29

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-11-2005 10:48

J'ai tripatouiller un peu la chose hier soir et j'avoue que je n'ai rien trouvé, je vais continuer à chercher...

JoE 12-11-2005 15:24

Quote:

Originally Posted by KnuX

Merci d'avance à celui qui aura une idée de génie

Heu ça:

^(?:(?!plouf).)*$\r?\n?

J'ai tout bon ?????

the5thorseman 12-11-2005 17:43

Quote:

Originally Posted by JoE
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-11-2005 18:37

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-11-2005 22:58

Qui a inventé ce langage de taré ? :D

the5thorseman 13-11-2005 23:10

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-11-2005 23:28

Quote:

Originally Posted by Cougar
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
:rolleyes: :p

1for-matik 13-11-2005 23:30

Quote:

Originally Posted by Spycam
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
:rolleyes: :p

Ahahahahaha elle est marrante celle là :confused:

KnuX 19-12-2005 21:46

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-12-2005 22:16

Est-ce que ceci pourrait aider le sieur KnuX ?

Code:

(www.|http://|ftp://)(?:(?!(plouf.com| )).)+
J'espère avoir bien cerné ce que tu voulais ;)

KnuX 19-12-2005 22:39

Comme vu sur IRC, non ;)


All times are GMT +2. The time now is 12:52.

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.