Dirijo un foro diseñado para apoyar a un grupo internacional de matemáticas. Recientemente lo cambié a unicode para un mejor soporte de caracteres internacionales. Al depurar esta conversión, descubrí que no todos los caracteres Unicode se consideran XHTML válidos (el sitio web pertinente parece ser http://www.w3.org/TR/unicode-xml/). Uno de los pasos que debe seguir el software del foro antes de presentar las publicaciones en el navegador es un paso de validación/desinfección de XHTML. Parece una idea razonable que, en ese momento, elimine cualquier carácter Unicode que no le guste a XHTML.¿Qué debo hacer para eliminar los caracteres Unicode que XHTML considera no válidos con php?
Así que mi pregunta es:
¿Existe una norma (o mejor) manera de hacer esto en PHP?
(El foro está escrito en PHP, por cierto.)
supongo que la prueba de fallos sería un simple str_replace
(si eso es también el mejor, qué tengo que hacer nada extra para asegurarse funciona correctamente con unicode?) pero eso implicaría tener que pasar por la DTD XHTML (o la página W3 mencionada anteriormente) con cuidado para averiguar qué caracteres enumerar en la búsqueda parte de str_replace
, así que si este es el mejor manera, ¿alguien ya lo hizo para poder robar, errar, copiar?
(Por cierto, el personaje que causó el problema era U + 000C, el 'avance de página', que (según la página W3) es HTML válido pero XHTML válido!)
Supongo que esto es más rápido que el método preg_replace (especialmente dado el comentario sobre la velocidad en http://php.net/manual/en/regexp.reference.unicode.php), pero tiene el mismo inconveniente que tengo que descubrir mi propia lista blanca. (¡Vea el comentario anterior acerca de ser flojo!) –
No tiene que averiguar su propia lista blanca. Los caracteres están permitidos según el código ASCII y se reemplazan con un espacio cuando quedan fuera del rango especificado por la función. Estoy bastante seguro de que esto es todo lo que necesitarás, la lista blanca ya está en la función. – Bas
Ciertamente hay un * * lista blanca en esa función, pero ¿cómo sé que es correcta la lista blanca? Por ejemplo, 0xC está permitido en HTML pero no en XHTML. Si estoy trabajando desde una lista blanca, debería ser generado de alguna manera desde la DTD. –