表达式
$delimiter."".$startTag."\r*\s*((?:(?!{$endTag}).\r*\s*)+)".$endTag.$delimiter
目标
编写正则表达式以提取位于块代码之间的字符串。
例如 [myblock] XYZ [/ myblock]
上面的表达式将提取xyz并忽略其他所有内容。
问题
这就像魅力一样,只要字符串不太长,在这种情况下服务器会抛出连接重置错误。
有人可以帮我弄清楚为什么堆栈会被淹没(据推测)?此外,高度赞赏上述优化。
答案 0 :(得分:1)
如果要保留模式的形式,可以写:
$delimiter . $startTag . "\s*((?:(?!{$endTag}).)*?)\s*" . $endTag . $delimiter . "s"
您的原始模式不适用于长字符串,因为您不使用非贪心量词(*?
而不是*
)
最后的s
是一个修饰符,允许.
匹配换行符。
另一种方法:
$tag = 'myblock';
$pattern = '~\[' . $tag . ']\s*((?:[^[]+|\[(?!/' . $tag . '))*+)\[/' . $tag .'~';
// and you use the rtrim function after