2016-03-28 18 views
0

Ich muss das Wort 'like' ohne das Wort 'not' vorher übereinstimmen. Im Beispiel unten gibt es eine 'not' vor dem Wort 'like', also sollte es nicht übereinstimmen. Wie würde ich das beheben?Übereinstimmende Regex ohne ein bestimmtes Wort hinter einem anderen Wort

$tempInput = "i do not like to fail"; 
if (preg_match("~(?!not)(like)~", $tempInput, $match)) { 

print_r($match); 

} 

Ergebnis:

Array ([0] => wie [1] => wie)

Ergebnis Brauchen:

Null

+0

Aus dem Wort 'like' brauchen Sie ** hinter aussehen ** oder ** ** voraus zu überprüfen, ob es keine' not' gibt es? – Rizier123

+1

Verwenden Sie ein negatives Lookbehind: ' "~ wie ~ (

+0

@ Rizier123 Gleich hinter . – frosty

Antwort

2

A negative lookbehind für literale Zeichenfolge not wie dies tun wird.

Regex:/(?<!not)like/

Erläuterung:

  • (?<!not) wird look behind und überprüfen, ob es Wort ist not.

  • like Wenn es nicht vorhanden ist, wird like abgeglichen.

Regex101 Demo

1

Hier ist eine kleine regex Magie.

Es ist einfach, die Verwendung einer Lookbehind-Assertion mit fester Breite einzuschränken.
Zum Beispiel, noobs Regex (?<!not)like entspricht not like ungültige Form
den ganzen Tag lang (nicht gut).

Aber diese (?<!not)(?<!\s)\s*\b(like) wird übereinstimmen, als ob eine Variable
Länge Lookbehind in PHP legal ist. In einer idealen Welt wäre es diese (?<!not\s+)like Variable.

Also, ich lasse dies für jeden, der sich fragen will, wie es funktioniert.
Das like Wort ist immer in Capture-Gruppe 1.

Als Bonus der like Gruppe jede Regex Unter Ausdruck sein kann.

(?<! not)  # Guard, Not 'not' behind 
(?<! \s)   # Guard, Not whitespace behind 
\s*    # Optional whitespace that can't be backtracked 
\b    # Word boundary 
(like)   # (1), 'like' 
Verwandte Themen