我正在使用PHP正则表达式。 考虑这样的文字:
Lorem ipsum (dolor sit
amet (consectetur adipiscing
elit) sed do eiusmod) tempor
(incididunt) ut
labore.
我需要匹配括号内的换行符,而不是括号外的换行符(如后两行)。我目前的正则表达式如下所示:/\([^)]*([\r\n]+)[^(]*\)/s
,但它并没有捕获" sit"之间的换行符。和" amet"因为嵌套的支撑。我可以只使用正则表达式,还是我必须手动解析文本?
答案 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
。