如何匹配内部(可能是嵌套)括号中的换行符? (正则表达式)

时间:2016-07-26 13:02:30

标签: php regex

我正在使用PHP正则表达式。 考虑这样的文字:

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

我需要匹配括号内的换行符,而不是括号外的换行符(如后两行)。我目前的正则表达式如下所示:/\([^)]*([\r\n]+)[^(]*\)/s,但它并没有捕获" sit"之间的换行符。和" amet"因为嵌套的支撑。我可以只使用正则表达式,还是我必须手动解析文本?

1 个答案:

答案 0 :(得分: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.

此外,请参阅php.net上的Recursive patterns