¿Qué hace este preg_replace_callback en PHP? y como evito que pierda memoria?
-
08-07-2019 - |
Pregunta
Tengo una sección de código en un sitio PHP de b2evo que hace lo siguiente:
$content = preg_replace_callback(
'/[\x80-\xff]/',
create_function( '$j', 'return "&#".ord($j[0]).";";' ),
$content);
¿Qué hace esta sección de código? Supongo que elimina los caracteres ascii entre 128 y 256, pero no puedo estar seguro.
Además, tal como está, cada vez que se llama a este bit de código desde una página, PHP asigna y luego no libera hasta 2K de memoria. Si la función se llama más de 1000 veces en una página (esto puede suceder), entonces la página usa 2 MB adicionales de memoria.
Esto está causando problemas con mi aplicación web. ¿Por qué estoy perdiendo memoria y cómo reescribo esto para no tener una pérdida de memoria?
Solución
Realmente no elimina, reemplaza los caracteres de alto Ascii por sus entidades.
Ver preg_replace_callback .
create_function se usa para crear una función anónima, pero puede usar una función simple en su lugar:
$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]) . ';';
}
[EDITAR] ¡Encontré una forma más limpia y probablemente más rápida de hacer el trabajo! ^ _ ^ Solo use htmlentities con opciones que se ajusten a sus necesidades.
Otros consejos
Es create_function
que está perdiendo memoria - solo usa una función normal y estarás bien.
La función en sí misma está reemplazando los caracteres con entidades HTML numéricas ( & amp; #xxx;
)
Es mucho más simple usar preg_replace
con la bandera / e
en su caso:
$content = preg_replace(
'/[\x80-\xff]/e',
'"&#".ord(<*>).";"',
$content);