o que isso preg_replace_callback fazer em PHP? e como faço para pará-lo com vazamento de memória?

StackOverflow https://stackoverflow.com/questions/295690

Pergunta

Eu tenho uma seção de código em um site PHP b2evo que faz o seguinte:

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

O que esta seção do código fazer? Meu palpite é que ele retira caracteres ASCII entre 128 e 256, mas não posso ter certeza.

Além disso, tal como está, cada vez que este pedaço de código é chamado de dentro de uma página, aloca PHP e depois não faz livre até 2K de memória. Se a função é chamado 1000 vezes em uma página (isso pode acontecer), então a página usa um 2MB de memória extra.

Isso está causando problemas com a minha aplicação web. Por que estou perdendo a memória, e como faço para reescrever isso para que eu não conseguir um vazamento de memória?

Foi útil?

Solução

Na verdade, não stripping, ele substitui caracteres ASCII altos são usados ??por suas entidades.

preg_replace_callback .
create_function é usado para fazer uma função anônima, mas você pode usar uma função simples em vez disso:

$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]) . ';';
}

[EDIT] Encontrado um produto de limpeza, provavelmente a maneira mais rápida para fazer o trabalho! ^ _ ^ Apenas usar htmlentities com opções de ajuste às suas necessidades.

Outras dicas

É de create_function que está vazando sua memória -. Usar apenas uma função normal em vez e você vai ficar bem

A função em si está substituindo os personagens com entidades HTML numéricos (&#xxx;)

É muito simples de usar preg_replace com a bandeira /e no seu caso:

$content = preg_replace(
    '/[\x80-\xff]/e',
    '"&#".ord($0).";"',
    $content);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top