Expression régulière et ET

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. 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
    1. Modérateur
      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
      1. 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
        1. Modérateur
          Re,

          Tu peux aussi utiliser les références arrière
          Par exemple
          (titi).*?(toto)|\2.*?\1
          --
          106485010510997108
          0
          1. Modérateur
            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
            1. Modérateur
              Re,

              Comment ça trois paramètres ou plus?
              Que comprends tu par paramètre?
              0
              1. 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
                1. Modérateur
                  Re,

                  Tu es obligé de faire :
                  Pas forcément.
                  Par exemple
                  titi.*toto|toto.*titi
                  --
                  106485010510997108
                  1
                  1. C'est pas faux. :p
                    0
                2. 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