0

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

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

这部分代码是做什么的?我的猜测是它会去除 128 到 256 之间的 ascii 字符,但我不能确定。

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

这导致我的 Web 应用程序出现问题。为什么我会丢失内存,以及如何重写它以免出现内存泄漏?

4

3 回答 3

4

就是create_function这会泄漏您的记忆-只需使用普通功能就可以了。

该函数本身正在用数字 HTML 实体 ( &#xxx;)替换字符

于 2008-11-17T14:37:22.797 回答
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]) . ';';
}

[编辑] 找到了一种更清洁、可能更快的方法来完成这项工作!^_^ 只需使用带有适合您需求的选项的 htmlentities。

于 2008-11-17T14:37:32.920 回答
0

preg_replace在您的情况下使用/e标志要简单得多:

$content = preg_replace(
    '/[\x80-\xff]/e',
    '"&#".ord($0).";"',
    $content);
于 2009-11-15T07:40:15.910 回答