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?

¿Fue útil?

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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top