o que isso preg_replace_callback fazer em PHP? e como faço para pará-lo com vazamento de memória?
-
08-07-2019 - |
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?
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);