2016-07-26 53 views
2

我正在使用PHP的正則表達式。 考慮文字是這樣的:如何匹配換行符(可能嵌套)的括號? (正則表達式)

Lorem ipsum (dolor sit 
amet (consectetur adipiscing 
elit) sed do eiusmod) tempor 
(incididunt) ut 
labore. 

我需要新行匹配括號內,但不是那些外支架(如過去兩年)。我目前的正則表達式如下所示:/\([^)]*([\r\n]+)[^(]*\)/s,但由於嵌套括號,它不捕獲「sit」和「amet」之間的換行符。我可以只使用正則表達式,還是必須手動解析文本?

回答

3

您可以將所有嵌套圓括號與遞歸正則表達式匹配,然後刪除preg_replace_callback內匹配值中的所有CRLF序列。

使用this regex匹配嵌套的括號:

'~\((?>[^()]++|(?R))*\)~' 

這裏是一個PHP demo

$re = '~\((?>[^()]++|(?R))*\)~'; 
$str = "Lorem ipsum (dolor sit \r\namet (consectetur adipiscing\r\n elit) sed do eiusmod) tempor \r\n(incididunt) ut \r\nlabore."; 
$output = preg_replace_callback($re, function($m) { 
    return str_replace("\r\n", "", $m[0]); 
}, $str); 
echo $output; 

輸出:

Lorem ipsum (dolor sit amet (consectetur adipiscing elit) sed do eiusmod) tempor 
(incididunt) ut 
labore. 

此外,請參閱Recursive patterns在php.net。

+1

完美的答案,正是我需要了解的!非常感謝 :) – Nee