Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 优化导致连接重置错误的正则表达式_Php_Regex_Preg Match All - Fatal编程技术网

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”?是的。我也尝试过另一种方式,但在性能方面没有太大的差别。太棒了!非常感谢。所有单元测试都会亮起绿灯,它也可以在浏览器上工作!我只是从正则表达式开始,对于解释我的方法失败的原因,我无法表达足够的感激之情。你是个明星@船长:谢谢。请注意,如果必须处理未关闭的块,则第二种方法可能更有效。(因为它会更快地失败)