2012-10-01 21 views
18

我有一個LONGTEXT列此數據(所以換行符被保留):PHP的preg_match不符合過去的換行符

Paragraph one 
Paragraph two 
Paragraph three 
Paragraph four 

我想通過我3.以配合第1款使用此代碼:

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

這不會返回任何內容。如果我嘗試只是段落的首行內工作,通過匹配:

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

然後代碼工作,並獲得正確的字符串返回。我在這裏做錯了什麼?

回答

42

使用s修改。

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

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

+0

警告:'/ s'修飾符是貪婪的。如果文本中有多個「三」,則匹配將包括所有文本直到最後一次發生。使用'/ sU'來防止這種情況(注意大寫字母U)。 –

+1

@FrankForte不是一個修飾符問題:'*'重複本身就是貪婪的。更好的方法是放一個問號讓它懶惰:'/ Para(。*?)three/s'。另外,'/ U'修飾符不會取消貪婪,但會反轉它:'*'變懶,'*?'變貪婪。 OP代碼不是問題,但它可以在更復雜的正則表達式中觸發奇怪的錯誤。 –

10

添加multi-line modifier

如:

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

對於任何人想知道的區別在這個和被接受的答案('s'修飾符)之間,'s'修飾符使'.'匹配換行符以及所有其他字符(默認情況下,它排除它們),而'm'則控制'^'和'$匹配;迫使它們只匹配整個字符串的開始和結束(幾乎 - 也見'D'),而不是每行的開始和結束。 – Dave

4

嘗試將正則表達式DOT-所有(額外的「末參數),所以它包含換行符:

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

heh。 @tassoeven擊敗了我! – guiniveretoo

+0

s獲勝的修飾符 – JoshHighland