2017-12-10 13 views
1

Ich versuchte, das PHP-Handbuch PCRE regex syntax->AssertionsPHP Regex Negative Assertions Erklärung

Es gibt eine Beschreibung wie folgt zu verstehen: foo(?!bar) matches any occurrence of "foo" that is NOT followed by "bar".

Während ich die Probe mit folgendem Ergebnis versucht:

$text = "foobar foobar foobar fooabar"; 
$rules = "/foo(!?bar)/is"; 
preg_match_all($rules, $text, $matches); 
$newLine = preg_replace($rules, "\thahaha", $text); 
print_r($matches); 
echo "<br/>"; 
echo $rules. ":" .$newLine; 

// result 
Array ([0] => Array ([0] => foobar [1] => foobar [2] => foobar) [1] =>  Array ([0] => bar [1] => bar [2] => bar)) 
/foo(!?bar)/is: hahaha hahaha hahaha fooabar 

Alle Vorkommen von "foo" mit "bar" wird ersetzt. Also, ist es eigentlich die gegenteilige Bedeutung? Oder habe ich etwas woanders vermisst? foo(?!bar) matches any occurrence of "foo" that is followed by "bar"???

Vielen Dank im Voraus.

+1

Es sollte "foo (?! Bar)" und nicht "foo (!? Bar)" sein. – Rahul

+1

Danke für Ihre Erklärung, ich sollte das nächste Mal genauer in die Details schauen. :) @Rahul – simongcc

Antwort

3

Ihre regex ist foo(!?bar) die für foo überprüfen wird sich dann optional! dann bar, die in den ersten drei Saiten zu finden ist. foobar foobar foobar

Sie haben ! und ? verlegt.

Richtige regex sollte foo(?!bar) sein, die letzte Saite fooabar

2

übereinstimmen? bezeichnet einen optionalen Ausdruck. In Ihrem Beispiel bedeutet das! kann da sein oder nicht. Das bedeutet, dass Sie bar oder !bar übereinstimmen.

Ein negativer Lookahead ist umgekehrt. (?!bar) Denken Sie daran, dass das Fragezeichen immer nach der öffnenden Klammer steht

+2

Vielen Dank für Ihre Zeit zu erklären, ich wähle nur die erste Antwort und upvote Sie auch. @fleischTH – simongcc