内存泄漏与preg_replace

时间:2010-02-26 10:42:58

标签: php regex memory-leaks

我正在使用preg_replace函数替换字符串中的重音符号,我正在使用UTF-8。

我在看似内存泄漏方面遇到了什么,但我无法隔离根本原因,我的代码相当简单:

    preg_replace(
        array_keys($aToNoAccents),
        array_values($aToNoAccents),
        $sText
    );

其中$aToNoAccents是一个关联数组,其条目如'~[Ą]~u' => 'A', '~[Ć]~u' => 'C',。 我的脚本为上面的行打印了这个错误:

Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 3039 bytes)

显然,这不是增加PHP允许的内存的问题(1Gb的占用空间远远超出了我的应用程序的规模)。此外,该行执行数千次没有问题,但是,对于某些难以重现的情况,它会产生错误。

是否有人知道preg_replace和UTF-8字符串的内存问题? 我是否特别注意将实际参数传递给这样的函数?

我正在使用带有Suhosin-Patch的PHP 5.2.6-3

2 个答案:

答案 0 :(得分:3)

您是否尝试过iconv而不是手工制作替换地图?

调整PHP手册中的示例

$text = "A String with lots of weird chars, like ĄĆ";

echo 'Original : ', $text, PHP_EOL;
echo 'TRANSLIT : ', iconv("UTF-8", "ISO-8859-1//TRANSLIT", $text), PHP_EOL;
echo 'IGNORE   : ', iconv("UTF-8", "ISO-8859-1//IGNORE", $text), PHP_EOL;
echo 'Plain    : ', iconv("UTF-8", "ISO-8859-1", $text), PHP_EOL;

会产生

Original : A String with lots of weird chars, like AC
TRANSLIT : A String with lots of weird chars, like AC
IGNORE   : A String with lots of weird chars, like AC
Plain    : A String with lots of weird chars, like AC

但这并不一定适用于您投入的任何字符。请尝试使用您想要的密钥。

答案 1 :(得分:1)

我有同样的问题(内存泄漏)没有preg_replace,我“听到”可能是它在php 5.2中的一个错误

我不确定但是如果你尝试使用php 5.0的相同脚本可能会有效。

仅供记录。

相关问题