Domanda

Ho una sezione di codice su un sito PHP b2evo che procede come segue:

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

Cosa fa questa sezione di codice? La mia ipotesi è che rimuova i caratteri ASCII tra 128 e 256, ma non posso esserne sicuro.

Inoltre, così com'è, ogni volta che questo bit di codice viene chiamato da una pagina, PHP alloca e quindi non libera fino a 2K di memoria. Se la funzione viene chiamata 1000+ volte su una pagina (ciò può accadere), la pagina utilizza 2 MB di memoria in più.

Questo sta causando problemi con la mia applicazione web. Perché sto perdendo memoria e come riscrivo questo in modo da non avere una perdita di memoria?

È stato utile?

Soluzione

Non proprio spogliarello, sostituisce i personaggi di alto Ascii con le loro entità.

Vedi preg_replace_callback .
create_function viene utilizzato per creare una funzione anonima, ma è invece possibile utilizzare una funzione semplice:

$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] Ho trovato un modo più pulito, probabilmente più veloce per fare il lavoro! ^ _ ^ Usa solo htmlentities con opzioni adatte alle tue esigenze.

Altri suggerimenti

È create_function che perde la tua memoria - usa invece una normale funzione e andrà tutto bene.

La funzione stessa sta sostituendo i caratteri con entità HTML numeriche ( & amp; #xxx; )

È molto più semplice usare preg_replace con la bandiera / e nel tuo caso:

$content = preg_replace(
    '/[\x80-\xff]/e',
    '"&#".ord(<*>).";"',
    $content);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top