簡體   English   中英

這個preg_replace_callback在PHP中做什么? 以及如何阻止它泄漏內存?

[英]what does this preg_replace_callback do in PHP? and how do I stop it leaking memory?

我在b2evo PHP網站上有一段代碼可以執行以下操作:

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

這部分代碼做什么? 我的猜測是,它會去除128至256之間的ASCII字符,但我不確定。

同樣,就目前而言,每次從頁面內調用此代碼位時,PHP都會分配內存,然后不會釋放多達2K的內存。 如果該函數在頁面上被調用1000次以上(可能發生),則該頁面將使用額外的2MB內存。

這導致我的Web應用程序出現問題。 為什么我會丟失內存,以及如何重寫它以免發生內存泄漏?

create_function泄漏了您的內存-只需使用常規函數即可,您會沒事的。

該函數本身正在用數字HTML實體( &#xxx; )替換字符&#xxx;

並不是真正的剝離,而是通過其實體替換了高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]) . ';';
}

[編輯]找到了一種更清潔,可能更快的方法來完成這項工作! ^ _ ^只需將htmlentities與適合您需求的選項一起使用。

在您的情況下,將preg_replace/e標志一起使用要簡單得多:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM