我正在使用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
答案 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的相同脚本可能会有效。
仅供记录。