[英]Fastcgi 500 error on preg_match_all in PHP
我正在尝试设置一些奇异的PHP代码(我不是专家),并且在包含“ preg_match_all”的PHP行上出现FastCGI错误500。
当我注释掉该行时,页面返回200(但不是它的原意)。
该代码将解析从数据库加载的PHP,HTML和JavaScript内容,并将它们组成以返回完成的页面。
现在,通过放置一些error_log
条目,我可以确定带有preg_match_all
的行是500的原因。但是,在页面加载过程中该行多次被击中,在其他情况下,该行不会导致错误。
看起来是这样的:
preg_match_all ("/(<([\w]+)[^>]*>)((?:.|\n)*)(<\/\\2>)/",
$part['data'], $tags, PREG_PATTERN_ORDER|PREG_OFFSET_CAPTURE);
主题字符串是一段类似于以下内容的文本:
<script> ... some javascript functions ... </script>
编辑:这是在其他地方正常运行的代码,因此这很可能是PHP设置或环境差异。 我在带有FastCGI的IIS6上使用PHP 5.2.13。
编辑:日志文件中未提及任何内容。 至少我没有检查过:
任何想法或方向都将受到欢迎。
$part['data']
可能会非常大吗? 当我在大于100 KB的字符串上使用preg_match_all
时,会出现500错误。
这是一个很好的例子,为什么用正则表达式处理HTML是个坏主意。 我敢打赌,由于HTML源字符串包含一些未关闭的标签,因此您正陷入堆栈溢出的局面,这使得regex尝试了各种各样的排列,以徒劳无益地尝试找到关闭标签( </\\2>
)。 在32 KB的HTML文件中,可以很容易地将正则表达式从手推车上扔下来。 也许堆栈在另一台服务器上的大小是不同的,所以它可以在一个服务器上工作,而在另一个服务器上不能工作。
快速测试:
我将正则表达式应用于了此页面的源代码(在删除了</html>
标记后)。 RegexBuddy立即进行了约一分钟的消声处理,然后与<head>
和<body>
标记匹配(成功)。 从<html>
调试正则表达式表明,它花了正则表达式引擎970257步骤来发现它不匹配。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.