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 に答える