Expression régulière et ET

gunbol Messages postés 52 Statut Membre -  
Mikey_UFC Messages postés 315 Statut Membre -
Bonjour,

Je suis à la recherche d'une réponse à une question bête:

Dans une ligne du genre "toto blablabla titi", je recherche une expression régulière qui permet de rechercher deux patterns: toto ET titi. Il faut que le résultat soit positif uniquement si les deux patterns ont été trouvés. Je n'ai pas la possibilité d'imbriquer deux expressions: il faut que ce soit dans une seule et unique expression régulière.

Le caractère & ne marche pas, alors que le | marche bien pour le OU.

"toto blablabla titi blbla" => OK
"titi blablablabl toto" => OK
"toto blabla" => KO
"blabla titi" => KO
"tititototiti" => OK

Il me faudrait un pattern du genre "(toto)LE_SIGNE_ET(titi)"

Je vais devenir fou (et j'ai déjà fait devenir fou mes collègues).

Merci d'avance pour votre aide !

Gunther
Configuration: Windows XP
Internet Explorer 6.0

9 réponses

  1. Mikey_UFC Messages postés 315 Statut Membre 1
     
    A ma connaissance, il n'y a pas de ET dans les expressions régulières.

    Tu es obligé de faire :
    if (recherche("toto", $maChaine) && recherche("titi", $maChaine))
    {
    // contient toto et titi
    }
    else
    {
    // ne contient pas ( toto et titi )
    }
    1
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    Tu es obligé de faire :
    Pas forcément.
    Par exemple
    titi.*toto|toto.*titi
    --
    106485010510997108
    1
    1. Mikey_UFC Messages postés 315 Statut Membre 1
       
      C'est pas faux. :p
      0
  3. gunbol Messages postés 52 Statut Membre 4
     
    Hello,

    Merci pour vos réponses.

    J'avais pensé à la solution de Lami20J, mais dès qu'on a trois paramêtres voire plus, c'est la galère, car il faut coder toutes les combinaisons.

    Pas aussi mortelles que ca les expressions régulières :o) !

    @+

    Gunther
    0
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    Comment ça trois paramètres ou plus?
    Que comprends tu par paramètre?
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    Par exemple en perl tu peux utiilser le quantificateur ? qui dit au moteur de regex de s'arrêter après la 1ère occurence trouvé
    titi.*?toto|toto.*?titi
    Tu n'as pas dit avec l'environnement pour tes regex.
    Php, Perl, sed, etc.
    0
  7. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    Tu peux aussi utiliser les références arrière
    Par exemple
    (titi).*?(toto)|\2.*?\1
    --
    106485010510997108
    0
  8. gunbol Messages postés 52 Statut Membre 4
     
    Par trois paramêtres, je veux dire que si je cherche:

    toto titi tutu tata, il faut faire une expression régulière qui prenne en compte toutes les combinaisons:

    titi.*toto.*tata.*tutu|toto.*titi.*tutu.*tata|titi.*tata.*toto.*tutu ......
    0
  9. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    Chaque regex c'est en fonction de texte source et de résultat voulu ;-)
    Par exemple
    (titi).*(toto).*(tata).*(tutu)|\4.*\1.*\2.*\3|\3.*\4.*\1.*\2|\2.*\3.*\4.*\1
    --
    106485010510997108
    0
  10. Mikey_UFC Messages postés 315 Statut Membre 1
     
    Si le nombre de paramètre est variable, je pense qu'il vaut mieux faire une recherche par mot.
    Chaque mot étant stocké dans un tableau.
    $trouve=true;
    foreach($tab as $mot)
      if !(recherche($mot, $chaine)) $trouve = false;
    if($trouve) echo "c bon";
    else echo "c pas bon";
    
    0