这个preg_replace_callback在PHP中做了什么?以及如何阻止它泄漏记忆?

时间:2008-11-17 14:35:25

标签: php preg-replace-callback create-function

我在b2evo PHP网站上有一段代码,它执行以下操作:

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

这部分代码有什么作用?我的猜测是它删除了128到256之间的ascii字符,但我不能确定。

此外,就目前而言,每次从页面内调用此代码时,PHP都会分配,然后不会释放高达2K的内存。如果在页面上调用该函数1000次(这可能发生),则该页面使用额外的2MB内存。

这导致我的网络应用程序出现问题。为什么我会丢失内存,如何重写内存以便我不会出现内存泄漏?

3 个答案:

答案 0 :(得分:4)

这是create_function泄露你的记忆 - 只是使用正常的功能而你会没事的。

函数本身正在用数字HTML实体(&#xxx;

替换字符

答案 1 :(得分: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]) . ';';
}

[编辑]找到一个更干净,可能更快的方式来完成这项工作! ^ _ ^只需使用符合您需求的选项即可。

答案 2 :(得分:0)

在您的案例中使用带有preg_replace标记的/e要简单得多:

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