优化导致连接重置错误的正则表达式

时间:2014-12-06 13:11:51

标签: php regex preg-match-all

表达式

$delimiter."".$startTag."\r*\s*((?:(?!{$endTag}).\r*\s*)+)".$endTag.$delimiter

目标

编写正则表达式以提取位于块代码之间的字符串。

例如 [myblock] XYZ [/ myblock]

上面的表达式将提取xyz并忽略其他所有内容。

问题

这就像魅力一样,只要字符串不太长,在这种情况下服务器会抛出连接重置错误。

有人可以帮我弄清楚为什么堆栈会被淹没(据推测)?此外,高度赞赏上述优化。

1 个答案:

答案 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