Que fait ce preg_replace_callback en PHP? et comment puis-je empêcher les fuites de mémoire?

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

Question

J'ai une section de code sur un site PHP b2evo qui effectue les opérations suivantes:

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

Que fait cette section de code? Je suppose que cela supprime les caractères ASCII entre 128 et 256, mais je ne peux pas en être sûr.

De plus, en l’état actuel, chaque fois que ce bit de code est appelé depuis une page, PHP alloue et ne libère pas jusqu’à 2K de mémoire. Si la fonction est appelée plus de 1000 fois sur une page (cela peut arriver), la page utilise alors 2 Mo de mémoire supplémentaire.

Cela pose des problèmes avec mon application Web. Pourquoi suis-je en train de perdre de la mémoire et comment puis-je l'écrire pour ne pas avoir de fuite de mémoire?

Était-ce utile?

La solution

Pas vraiment décapant, il remplace les caractères très ascii par leurs entités.

Voir preg_replace_callback .
create_function est utilisé pour créer une fonction anonyme, mais vous pouvez utiliser une fonction simple à la place:

$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] Vous avez trouvé un nettoyeur, probablement un moyen plus rapide de faire le travail! ^ _ ^ Utilisez simplement htmlentities avec les options correspondant à vos besoins.

Autres conseils

C'est create_function qui fuit votre mémoire - utilisez plutôt une fonction normale à la place et tout ira bien.

La fonction elle-même remplace les caractères par des entités HTML numériques ( & amp; #xxx; )

Il est beaucoup plus simple d'utiliser preg_replace avec l'indicateur / e dans votre cas:

$content = preg_replace(
    '/[\x80-\xff]/e',
    '"&#".ord(<*>).";"',
    $content);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top