PHP在执行preg_replace时出现了分段错误

4
我正在使用Magento,在从管理页面回滚数据库时出现PHP分段错误。经过调查,我发现原因是以下这行代码:
preg_replace("/'(\\'|\\\\{2}|[^'])*'/", '', $sql);
$sql字符串太长了,我在这里附上它。
您可以使用以下脚本重现此问题:

https://drive.google.com/file/d/0B9UbKYbywcABOTRSVG5KRl9La0k/edit?usp=sharing

<?php
    $test = file_get_contents('test.txt');
    $sql = preg_replace("/'(\\'|\\\\{2}|[^'])*'/", '', $test);

也许有人知道这个问题并能帮我解决吗?

P.S. 直接导致问题的类是抽象类Zend_Db_Statement 204:208。


你为什么要用正则表达式来搞乱你的 SQL 呢? - Marc B
这不是我的代码。这是Magento的代码,用于回滚自己的备份(SQL)。它逐一执行语句,并使用Zend Framework执行它。在我的服务器上(和其他一些服务器上),回滚功能无法正常工作,因此我尝试定位问题。经过调查,我了解到问题出现在preg_replace中。 - freento
2个回答

5

+1 - 当一个模块的升级脚本运行了一个大的preg_replace()调用时,我遇到了这个问题;降低递归限制消除了分段错误,使模块成功升级。 - STW

0
基于这篇文章:http://man.he.net/man3/pcrestack 你可以尝试修改正则表达式以使用更少的堆栈。
例如,我会尝试类似的方法:
preg_replace("/'([^']+|\\'|\\\\{2})*'/", '', $sql);

或者在这里:https://bugs.php.net/bug.php?id=61579

他们还提到了这两个替代方案:

"/'(\\\\'|\\\\{2}|[^']+)*'/"

"/'[^'\\\\]*(?:\\\\.[^'\\\\]*)*'/"

OP的问题涉及到Magento核心代码中的一部分(绝对不要,永远不要去碰);更改正则表达式可能有效,但应该是最后的极端手段。 - STW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接