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. 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
    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. 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,

        Comment ça trois paramètres ou plus?
        Que comprends tu par paramètre?
        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,

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

                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. 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