2010-02-26 40 views
0

我使用的preg_replace函数替换字符串口音内存泄漏,我用UTF-8的工作。用了preg_replace

我已经发生在什么似乎是内存泄漏,但我无法找出根本原因,我的代码是相当简单:

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字符串? 我是否需要特别注意将实际参数传递给此功能?

我使用PHP 5.2.6-3用了Suhosin贴片

+2

是那些regexps?否则,你应该使用'str_replace'来代替它,看看它是否更好? – 2010-02-26 10:47:03

+0

是的,也许我不需要它们是正则表达式。我试一试 – 2010-02-26 11:22:23

回答

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 

但是,这并不一定会与你抛出任何字符工作,给它以所需的键试试。

+0

这将是一个好主意,但不幸的是,对于一些国家,我需要完全控制哪个字符被转换为哪个字符,因此我无法使用外部工具来执行该任务。 – 2010-02-26 11:52:31

1

我有同样的问题(内存泄漏)不会的preg_replace和我“听”,可能它在PHP 5.2

的错误,我不知道,但如果你试图在同一个脚本使用PHP 5.0可能会奏效。

只是为了记录。

+1

如果在PHP中一个已知的bug,你会在http://bugs.php.net/ – Gordon 2010-02-26 12:42:55

+0

找到它呀,你可以在这里添加一个链接,导致错误? – Till 2010-04-08 12:03:50

+1

有这么建议的preg_replace缓存高达4096个结果的请求这里新手必看:http://blog.killtheradio.net/tricks-hacks/phps-preg-functions-dont-release-memory/ – 2013-05-29 00:47:14