2012-09-18 17 views
5

C'è una stringa che sto cercando di produrre in un modo codificato in html, e htmlentities() function restituisce sempre una stringa vuota.utilizzando la nuova costante del php 5.4 ENT_DISALLOWED in htmlentities

So esattamente perché lo fa. Beh, non sto eseguendo PHP 5.4 ho installato l'ultimo PHP 5.3 flavor.

La domanda è come riuscirò a codificare HTML una stringa che ha sequenze di unità di codice non valide.

Secondo il manuale, ENT_SUBSTITUTE è la strada da percorrere. Ma questa costante non è definita in PHP 5.3.X.

ho fatto questo:

if (!defined('ENT_SUBSTITUTE')) { 
    define('ENT_SUBSTITUTE', 8); 
} 

ancora senza fortuna. htmlentities sta ancora restituendo una stringa vuota.

Ho voluto provare invece il ENT_DISALLOWED, ma non riesco a trovare il relativo valore lungo corrispondente.

Quindi la mia domanda è di due piegato

  1. Qual è il valore costante di PHP 5.4 di ENT_DISALLOWED?

  2. Come faccio a verificare che una stringa contenente caratteri non UTF-8 (come smart quotes), possa essere eliminata? - Non solo le virgolette intelligenti ma tutto ciò che causa htmlentities() per restituire una stringa vuota.

risposta

2

Come dici tu, queste costanti were added in 5.4.0. Il fatto è che il supporto è nuovo anche per 5.4.0. Significa che puoi passare qualunque valore tu voglia, il vecchio htmlentities non lo capirà.

Come è probabilmente il caso, php changelog è piuttosto fuorviante.

3

È vero che lo htmlentities() in PHP 5.3 non ha il flag ENT_SUBSTITUTE, tuttavia ha il flag (non molto consigliato) ENT_IGNORE. Essere articoli della nota e cercare di comprenderlo prima dell'uso:

L'utilizzo di questo flag è sconsigliato perché è » may have security implications.

È molto meglio capire perché c'è un problema con la stringa di input in primo luogo. Molto spesso gli utenti mancano solo per specificare la codifica corretta.

E.g. prima ricodificare la stringa in UTF-8, quindi passarla a htmlspecialchars() o htmlentities(). A proposito di citazioni intelligenti, probabilmente stai usando una stringa codificata Windows-1252. Non sarà nemmeno necessario convertire quella prima dell'uso, si può semplicemente specificare il set di caratteri corretto (PHP 5.3):

htmlentities($string, ENT_QUOTES, $encoding = 'Windows-1252'); 

Naturalmente questo funziona solo se l'ingresso $string è codificato in Windows-1252 (CP1252).Scopri prima la codifica corretta, quindi normalmente non è un problema. Per le codifiche non supportate ricodificare prima in una supportata, ad esempio con iconv o mb_string.

+0

Se qualcuno sta cercando questo perché sta seguendo Lynda.com MYSQL Essential Training e si è imbattuto in "Uso di un errore ENT_SUBSTITUTE costante non definito" nella riga 600 in Sid.php, ti dirò in base a ciò che ho letto qui e che non sono riuscito a trovare un chiaro flag equivalente per PHP 5.3, sono andato avanti e ho cancellato quella bandiera e l'app funziona correttamente ora. Ci sono implicazioni sulla sicurezza come ha notato @hakre, ma sto lavorando su un server di sviluppo locale senza accesso al web. –

Problemi correlati