2013-05-05 21 views
13
htmlspecialchars($string, ENT_NOQUOTES); 

... è di circa 2,5 volte più lento di:Perché "htmlspecialchars" è lento?

str_replace(array('&', '<', '>'), array('&amp;', '&lt;', '&gt;'), $string); 

Vuol htmlspecialchars fare qualcosa che la linea str_replace non lo fa?

p.s. Ho misurato la velocità in PHP 5.4, usando microtime.

+3

@Juampi Prendi una pugnalata a ciò che ENT_NOQUOTES significa ... –

+5

Ecco la fonte https://github.com/php/php-src/blob/master/ext/standard/html.c Ha un lavoro aggiuntivo considerando il set di caratteri in anticipo, utilizzando diversi set sostitutivi invece dell'elenco fisso di str_replace, ecc. – mario

+1

Utilizzare anche meglio 'strtr' di' str_replace'. Ma questo è solo un commento. – hakre

risposta

12

str_replace() considera stringhe come stringhe ASCII. htmlspecialchars() no. (Sono le stringhe UTF8 per impostazione predefinita in php 5.4, se la memoria serve.)

Inoltre, c'è il codice in htmlspecialchars() per evitare la doppia codifica, ecc. Fa più cose.

+0

Puoi dare un esempio di un caso in cui sarebbe utile usare ' htmlspecialchars' su 'str_replace'? –

+0

Oltre ai problemi di doppia codifica, ci sono presumibilmente casi in cui 'str_replace()' accetta volentieri stringhe UTF8 non valide mentre 'htmlspecialchars()' probabilmente no. Ricorda perché 'mysql_real_escape_string()' è stato introdotto nel corso della giornata: a causa del potenziale di iniezioni SQL quando non ti sei preoccupato della codifica. –

0

La documentazione indica che htmlspecialchars() ha un parametro in cui è possibile immettere il set di caratteri che si desidera utilizzare e codificherà tutto anche due volte per impostazione predefinita.

2

Vedere documentation.

Il motivo per cui è più lento è perché fa di più. Gestisce varie citazioni, codifiche e doppie codifiche.

L'elaborazione delle codifiche può essere piuttosto lenta. Poiché i computer sono molto veloci, non dovrebbe importare molto, ma se lo confronti con una semplice ricerca e sostituzione (che è praticamente tutto str_replace) sarà più lento.