2010-02-10 95 views
14

我敢肯定這是微不足道的,但我無法創建一個考慮到主題由多行組成的正則表達式。一個「m」修飾符似乎沒有工作。php preg_replace匹配多行的正則表達式

+0

你是積極的正則表達式是正確的嗎? – Romain 2010-02-10 21:11:01

+0

使用msu 詳細閱讀下面的鏈接http://zendf.wordpress.com/2012/02/08/php-preg_match-multi-line-match/ – Tofeeq 2012-02-08 13:44:57

回答

7

你試過''修飾符了嗎?意思是「像對待單線一樣對待。 'm'可以使用^和$行開頭和結尾。

+0

Ah IC,明天將嘗試@work。還有一個問題,我如何匹配換行符,空格或製表符?到目前爲止,我已經提出了「[\\ n \\ t] *」,這是正確的? – 2010-02-10 21:37:18

+0

只需使用'\ s',表示任何空格字符。 – 2010-02-10 21:40:27

+0

\ s匹配'空白'(意思是\ t和空格),我相信它可能包含\ n以及與's'一起使用。 – ziya 2010-02-10 21:40:45

45

Maxwell特洛伊米爾頓國王是對的,但由於他的回答有點短,我會發布這個以及提供一些例子來說明。

首先,.元字符默認不匹配換行符。許多正則表達式的實現都是如此,包括PHP的風格。這就是說,把文字:

$text = "Line 1\nLine 2\nLine 3"; 

和正則表達式

'/.*/' 

那麼正則表達式將只匹配Line 1。見自己:

preg_match('/.*/', $text, $match); 
echo $match[0]; // echos: 'Line 1' 

.* 「停止匹配」 的\n(新行字符)。如果你想讓它匹配換行符以及在你的正則表達式的末尾添加S-改性劑(又名DOT-ALL修改):

preg_match('/.*/s', $text, $match); 
echo $match[0]; // echos: 'Line 1\nLine 2\nLine 3' 

現在關於M-修飾符(多線):這將使^不僅匹配輸入字符串的開始,而且還匹配每行的開始。與$相同:它將使$不僅匹配輸入字符串的結尾,而且還匹配每行的結尾。

一個例子:

$text = "Line 1\nLine 2\nLine 3"; 
preg_match_all('/[0-9]$/', $text, $matches); 
print_r($matches); 

將匹配僅3(在輸入的端)。但:

但使第m改性劑:

$text = "Line 1\nLine 2\nLine 3"; 
preg_match_all('/[0-9]$/m', $text, $matches); 
print_r($matches); 

所有(單一)位在每一行的末尾( '1', '2' 和 '3')是匹配的。

+3

+1奇妙的答案 – blak3r 2012-04-05 02:00:41