Php 优化导致连接重置错误的正则表达式
表达Php 优化导致连接重置错误的正则表达式,php,regex,preg-match-all,Php,Regex,Preg Match All,表达 $delimiter."".$startTag."\r*\s*((?:(?!{$endTag}).\r*\s*)+)".$endTag.$delimiter 目标 编写正则表达式是为了提取位于块代码之间的字符串 比如说 [我的区块] xyz [/myblock] 上面的表达式将提取xyz并忽略其他所有内容 问题 这就像一个符咒,只要字符串不太长,在这种情况下,服务器抛出一个连接重置错误 有人能帮我弄清楚为什么烟囱被淹没了吗?此外,我们非常感谢您对上述内容进行优化。如果您希望保留模式的形式
$delimiter."".$startTag."\r*\s*((?:(?!{$endTag}).\r*\s*)+)".$endTag.$delimiter
目标
编写正则表达式是为了提取位于块代码之间的字符串
比如说
[我的区块]
xyz
[/myblock]
上面的表达式将提取xyz并忽略其他所有内容
问题
这就像一个符咒,只要字符串不太长,在这种情况下,服务器抛出一个连接重置错误
有人能帮我弄清楚为什么烟囱被淹没了吗?此外,我们非常感谢您对上述内容进行优化。如果您希望保留模式的形式,您可以编写:
$delimiter . $startTag . "\s*((?:(?!{$endTag}).)*?)\s*" . $endTag . $delimiter . "s"
您的原始模式不适用于长字符串,因为您没有特别使用非贪婪量词(*?
而不是*
)
末尾的s
是一个修饰符,允许
匹配换行符
另一种方法:
$tag = 'myblock';
$pattern = '~\[' . $tag . ']\s*((?:[^[]+|\[(?!/' . $tag . '))*+)\[/' . $tag .'~';
// and you use the rtrim function after
是否要在块之间修剪内容?所以说是“xyz”而不是“xyz”?是的。我也尝试过另一种方式,但在性能方面没有太大的差别。太棒了!非常感谢。所有单元测试都会亮起绿灯,它也可以在浏览器上工作!我只是从正则表达式开始,对于解释我的方法失败的原因,我无法表达足够的感激之情。你是个明星@船长:谢谢。请注意,如果必须处理未关闭的块,则第二种方法可能更有效。(因为它会更快地失败)