2017-02-13 7 views
-1

in php.net preg_match Seite, heißt es

Hinweis: Verwendung von Versatz entspricht nicht der substr zu vorbei ($, $ versatz) an> preg_match() anstelle von die Betreff-Zeichenfolge, weil das Muster> Assertions wie ^, $ oder (? < = x) enthalten kann.

php.net

Bedeutet dies die Offset Option wird ignoriert, wenn es Behauptungen in dem Muster sind. Wie sich die Zusicherungen auf die Betreff-Strings auswirken

Antwort

2

Nein, der Offset wird nicht ignoriert, aber diese Assertionen gelten für den gesamten String, nicht für den String, der vom Offset ausgeht. Sie können also ein anderes Ergebnis erhalten, je nachdem, ob Sie eine Teilzeichenfolge übergeben oder das Offset-Argument verwenden. Insbesondere passt ^ den Anfang der Zeichenfolge, nicht die Offset-Position.

Im folgende Beispiel wird die zitierte Zeile macht dies deutlich:

$subject = "abcdef"; 
$pattern = '/^def/'; 
preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, 3); 

Dies keine Übereinstimmung finden, denn auch wenn def bei 3 in der Zeichenfolge ist, ist es nicht am Anfang der Zeichenfolge ist.

Wenn der Offset einfach ignoriert würde, könnten Sie ein Muster wie /^abc/ verwenden und es würde übereinstimmen. Aber das wird auch nicht passen, weil abc vor dem Offset ist.

+0

dann, wie ist diese Option immer nützlich, wenn Behauptungen wie diese kann es zu nichts passen –

+0

Es ist nützlich für andere reguläre Ausdrücke. – Barmar

+0

Das Muster würde übereinstimmen, wenn es 'tut; preg_match ($ pattern, substr ($ subject, 3), $ Übereinstimmungen, PREG_OFFSET_CAPTURE); ' –