2016-09-15 4 views
0

Angenommen, wir haben 3 Strings:Streicher-Set Regex Abfrage wie Charsets für Match Jede Bestellung

lorem,ipsum,set 

und Code, Eingabezeichenfolgen und die erwarteten Ergebnisse sind:

$array = array(
    "lorem" => "lorem", 
    "loremipsum" => "loremipsum", 
    "loremipsumset" => "FOUND!", 
    "abc loremipsumset xyz" => "abc FOUND! xyz", 
    "ipsumsetlorem" => "FOUND!", 
    "ipsumloremset" => "FOUND!", 
    "setipsumloremsetset" => "FOUND!", 
    "loremloremipsumipsumsetset" => "FOUND!", // tough one... 
    "lorem ipsum set" => "lorem ipsum set", 
) ; 
foreach ($array as $string => $expect) { 
    $result preg_replace($REGEX,'FOUND!','abacdaef'); 
    echo ($result == $expect ? 'THANKS!!' : '...') ; 
    echo '<br>' ; 
} 

Drei-String haben, zusammen zu sein in bestimmten Eingang, aber mit jeder Bestellung ...

"/((lorem|ipsum|set)+(lorem|ipsum|set)+(lorem|ipsum|set)+)+/" 

Dies funktioniert irgendwie, aber es ist passend auch mit „lorem loremorem ",

Welche Art von Regex kann damit umgehen? oder gibt es einen einfachen Weg?

+0

Eigentlich, warum nicht nur benutzen ' "/ (?: lorem | ipsum | set) + /"'? –

+1

@ WiktorStribiżew Ich denke, einige der Beispiele, die zur Verfügung gestellt werden, implizieren, dass Strings, die nicht alle Teilstrings enthalten, nicht übereinstimmen sollten. Zum Beispiel glaube ich nicht, dass "Lorem" übereinstimmen sollte. –

+0

Ja, aber die erste Regex ist dann nicht angemessen. Es sollte ['([abc]) (?! \ 1) ([abc]) (?! \ 1 | \ 2) [abc]'] sein (https://regex101.com/r/fL1fR0/1) . Das bedeutet auch, dass es für eine Regex keine gute Arbeit ist. Der zweite muss ['(lorem | ipsum | set) (?! \ 1) (lorem | ipsum | set) (?! \ 1 | \ 2) (?: lorem | ipsum | set)'] sein (https: //regex101.com/r/fL1fR0/2). Das ist nicht leicht erweiterbar im Falle von Dutzenden von Saiten. –

Antwort

1

Sie können es so machen.
PHP unterstützt Bedingungen. Wenn Sie eine Wache um jedes Wort legen, das Sie wollen
übereinstimmen, wird es die Engine zwingen, alle von ihnen mindestens einmal übereinstimmen.

https://regex101.com/r/fL1fR0/3

eine andere Zeichenfolge hinzu:

  • es in einer separaten Gruppe bedingt mit seiner Gruppe Put | ((?(4)(?!))new string)
  • es zum Gesamt Wechsel Liste (?: lorem | ipsum | set | new string)
  • Erhöhungsschritte der Bereich gleich die Anzahl der separaten Strings {4}

Dies entspricht allen Orten in Ihrem Array, wo FOUND ersetzt wird.

\b(?:(?:((?(1)(?!))lorem)|((?(2)(?!))ipsum)|((?(3)(?!))set))(?:lorem|ipsum|set)*){3}\b

Expanded
\b 
(?: 
     (?: 
      (      # (1) 
       (?(1) 
        (?!) 
       ) 
       lorem 
      ) 
     | (      # (2) 
       (?(2) 
        (?!) 
       ) 
       ipsum 
      ) 
     | (      # (3) 
       (?(3) 
        (?!) 
       ) 
       set 
      ) 
    ) 
     (?: lorem | ipsum | set)* 
){3} 
\b 
+0

Das funktioniert wahrscheinlich, sieht aber schrecklich aus :) – Digerkam

+0

Einfach wie Kuchen http://www.regexformat.com – sln

+0

/((lorem | ipsum | set) + (lorem | ipsum | set) + (lorem | ipsum | set) +)/funktioniert besser – Digerkam