2010-02-26 75 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