2008-11-17 28 views
0

我有代碼上b2evo PHP網站,做如下的一段:這個preg_replace_callback在PHP中做什麼?我該如何阻止它泄漏內存?

$content = preg_replace_callback(
    '/[\x80-\xff]/', 
    create_function('$j', 'return "&#".ord($j[0]).";";'), 
    $content); 

是什麼這部分代碼嗎?我的猜測是,它刪除了128到256之間的ASCII字符,但我無法確定。另外,就目前而言,每次從頁面內調用這段代碼時,PHP都會分配內存,然後不會釋放內存2K。如果該功能在頁面上被調用了1000次以上(這可能發生),那麼該頁面會使用額外的2MB內存。

這導致我的web應用程序出現問題。爲什麼我會失去記憶,以及如何重寫這個內容,以免發生內存泄漏?

+0

正如我在更新指出,更換ヶ輛這種RE功能,它應該是罰款... – PhiLho 2008-11-17 15:06:54

+0

感謝。太精彩了。 – seanyboy 2008-11-17 16:07:18

回答

3

不是真的剝離替換字符的功能,它通過自己的實體取代高ASCII字符。

請參閱preg_replace_callback
create_function是用來做一個匿名函數,但你可以用一個簡單的函數:

$content = 'Çà ! Nœm dé fîçhïèr tôrdù, @ pöür têstër... ? ~ Œ[€]'; 
$content = preg_replace_callback('/[\x80-\xff]/', 'CB_CharToEntity', $content); 
echo $econtent . '<br>'; 
echo htmlspecialchars($content) . '<br>'; 
echo htmlentities($content) . '<br>'; 
echo htmlentities($content, ENT_NOQUOTES, 'cp1252') . '<br>'; 

function CB_CharToEntity($matches) 
{ 
    return '&#' . ord($matches[0]) . ';'; 
} 

[編輯]找到一個更清潔,也許更快的方式做的工作!^_ ^只需使用適合您需求的選項即可。

4

這是create_function這是泄漏你的記憶 - 只是使用一個正常的功能,而不是你會沒事的。

本身與數字HTML實體(&#xxx;

0

這是一個簡單得多,你的情況使用preg_replace/e標誌:

$content = preg_replace(
    '/[\x80-\xff]/e', 
    '"&#".ord($0).";"', 
    $content);