2012-09-18 62 views
5

Hay una cadena que estoy tratando de dar salida en una forma htmlencoded, y la htmlentities() function siempre devuelve una cadena vacía.usando la nueva constante de php 5.4 ENT_DISALLOWED en htmlentities

Sé exactamente por qué lo hace. Bueno, no estoy ejecutando PHP 5.4 Obtuve el último sabor de PHP 5.3 instalado.

La cuestión es cómo voy a poder htmlencode una secuencia que tiene secuencias de unidad de código no válidas.

De acuerdo con el manual, ENT_SUBSTITUTE es el camino a seguir. Pero esta constante no está definida en PHP 5.3.X.

Hice esto:

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

sigue sin suerte. htmlentities sigue devolviendo cadena vacía.

Quería probar ENT_DISALLOWED en su lugar, pero no puedo encontrar su valor largo correspondiente para ello.

Así que mi pregunta es de dos plegados

  1. ¿Cuál es el valor constante de PHP 5.4 de ENT_DISALLOWED?

  2. ¿Cómo me aseguro de que una cadena que contiene caracteres que no sean UTF-8 (como smart quotes) se puede borrar de ellos? - No solo las comillas inteligentes, sino cualquier cosa que provoque que htmlentities() devuelva una cadena en blanco.

Respuesta

2

Como usted dice, estas constantes were added en 5.4.0. El caso es que el soporte es nuevo en 5.4.0 también. Lo que significa que puede pasar los valores que desee, más viejo htmlentities no lo entenderá.

Como probablemente sea el caso, php changelog es bastante engañoso.

3

Es cierto que htmlentities() en PHP 5.3 no tiene la bandera ENT_SUBSTITUTE, sin embargo, tiene la (realmente no sugerida) ENT_IGNORE bandera. Tenga en cuenta la nota e intente comprenderla antes de su uso:

No se recomienda el uso de esta marca como » may have security implications.

Es mucho mejor que comprenda por qué hay un problema con la cadena de entrada en primer lugar. La mayoría de las veces, los usuarios solo faltan para especificar la codificación correcta.

E.g. primero vuelva a codificar la cadena en UTF-8, luego páselo a htmlspecialchars() o htmlentities(). Hablando de citas inteligentes, probablemente estés usando una cadena codificada en Windows-1252. Ni siquiera tendrá que convertir que uno antes de su uso, sólo puede especificar el juego de caracteres correctamente (PHP 5.3):

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

Naturalmente, esto sólo funciona si la entrada $string está codificado en Windows-1252 (CP1252).Averigüe primero la codificación correcta, entonces normalmente no hay problema. Para las codificaciones no compatibles, vuelva a codificar primero en una compatible, por ejemplo con iconv o mb_string.

+0

Si alguien está buscando esto porque está siguiendo el entrenamiento esencial de MYSQL de Lynda.com y se encontró con el error "Uso de la constante indefinida ENT_SUBSTITUTE" en la línea 600 en Sid.php, le diré en base a lo que he leído aquí y que no pude encontrar una bandera equivalente clara para PHP 5.3, continué y borré esa bandera y la aplicación funciona bien ahora. Hay implicaciones de seguridad como señaló @hakre, pero estoy trabajando en un servidor de desarrollo local sin acceso a la web. –

Cuestiones relacionadas