2012-10-01 19 views
18

Ich habe diese Daten in einer Spalte LONG (so die Zeilenumbrüche bleiben erhalten):PHP preg_match nicht vorbei Linie passend bricht

Paragraph one 
Paragraph two 
Paragraph three 
Paragraph four 

Ich versuche, Absatz 1 bis 3 I entsprechen verwende diesen Code:

preg_match('/Para(.*)three/', $row['file'], $m); 

Dies gibt nichts zurück. Wenn ich versuche, nur innerhalb der ersten Zeile des Absatzes zu arbeiten, durch Anpassung:

preg_match('/Para(.*)one/', $row['file'], $m); 

Dann funktioniert der Code und ich bekomme die richtige Zeichenfolge zurückgegeben. Was mache ich hier falsch?

Antwort

42

Verwendung s Modifikator.

preg_match('/Para(.*)three/s', $row['file'], $m); 

http://php.net/manual/en/reference.pcre.pattern.modifiers.php

+0

Warnung: Der '/ s' Modifikator ist gierig. Wenn es mehr als eine "drei" im Text gibt, wird die Übereinstimmung den gesamten Text bis zum letzten Vorkommen enthalten. Verwenden Sie '/ sU', um dies zu verhindern (beachten Sie das Großbuchstabe U). –

+1

@FrankForte nicht wirklich ein Modifikator Problem: die '*' Wiederholung ist per se gierig. Ein besserer Ansatz ist es, ein Fragezeichen zu setzen, um es faul zu machen: '/ Para (. *?) Three/s'. Der '/ U'-Modifier hebt Greedy nicht auf, sondern invertiert ihn: '*' wird faul und '*?' Wird gierig. Es ist kein Problem mit OP-Code, aber es kann seltsame Fehler in einem komplexeren regulären Ausdruck auslösen. –

10

Fügen Sie die multi-line modifier hinzu.

ZB:

preg_match('/Para(.*)three/m', $row['file'], $m) 
+8

Für alle, über den Unterschied fragen zwischen dieser und der akzeptierten Antwort ('s' Modifizierer), macht der' s' Modifikator '.' mit Newlines sowie allen anderen Zeichen (standardmäßig schließt es sie aus), während' m' steuert, wie '^' und '$ 'Spiel; Erzwingt, dass sie nur den Anfang und das Ende der gesamten Zeichenfolge (fast - siehe auch "D") im Gegensatz zum Anfang und Ende jeder Zeile angleichen. – Dave

4

Versuchen Sie, die regex Einstellung zu Punkt-alle (die extra 's' Parameter am Ende), so enthält es Zeilenumbrüche:

preg_match('/Para(.*)three/s', $row['file'], $m); 
+0

heh. @tassoeven schlagt mich dazu! – guiniveretoo

+0

s Modifikator für den Sieg – JoshHighland