Sustituir los caracteres especiales del HTML con una función PHP. Una función para convertir, todos los caracteres especiales del HTML con PHP.
Los caracteres especiales, en principio, deberían escribirse con sus correspondientes códigos, aunque muchas veces no se hace por comodidad o porque se ven correctamente en nuestro ordenador y pensamos que así de bien los vería cualquier persona. En este artículo de desarrollo web .com vamos a mostrar cómo convertir fácilmente los caracteres especiales del HTML por medio de una única función PHP, que recibirá el texto con acentos y caracteres para convertir y lo devolverá una vez procesado y convertidos los caracteres. La clave de este ejercicio es convertir dichos caracteres especiales, pero sin alterar las etiquetas HTML que pueda tener el texto. Luego explicaré esto con detalle.
Lo bueno de este script que vamos a comentar es que está creado haciendo uso de algunas funciones que trae PHP de casa, con lo cual, no tenemos por qué conocer la lista completa de los caracteres especiales. Simplemente utilizaremos algunas funciones interesantes del lenguaje.
Funciones de PHP para hacer traducción de caracteres especiales
En PHP existen varias funciones para cambiar caracteres por sus códigos especiales, pero ninguna de las funciones hace el trabajo justamente como deseaba. Primero veamos dichas funciones:
htmlentities(): esta función transforma todos los caracteres de un texto que tienen conversión a caracteres especiales. Esto incluye desde los acentos o la eñe a los mayores y menores qué, las comillas, etc.
htmlspecialchars(): esta función convierte sólo los caracteres especiales que pueden afectar a las etiquetas HTML, como mayor y menor qué, comillas simples y dobles y el carácter &.
La primera función, htmlentities, no me sirve porque mi texto contiene etiquetas HTML y no quería que se afectaran dichas etiquetas y que al poner el texto en la página se viera formateado con las etiquetas escritas. Si pasamos htmlentities, las etiquetas HTML luego serían interpretadas como texto. Por su parte htmlspecialchars tampoco me sirve, porque sólo convierte los caracteres que tienen que ver con las etiquetas, y son justo esos los que quiero dejar inalterados.
Así que vamos a ver una función nueva, no incluida en PHP pero que se basa en funciones del lenguaje, para convertir sólo los caracteres que nos interesan. Esta función la utilizamos en DesarrolloWeb.com y otros sitios de nuestros. Hay que decir que he tomado la inspiración para hacer esta función de un comentario que hay en la propia página de php.net.
Veamos el código PHP de la función:
function convertir_especiales_html($str){
if (!isset($GLOBALS["carateres_latinos"])){
$todas = get_html_translation_table(HTML_ENTITIES, ENT_NOQUOTES);
$etiquetas = get_html_translation_table(HTML_SPECIALCHARS, ENT_NOQUOTES);
$GLOBALS["carateres_latinos"] = array_diff($todas, $etiquetas);
}
$str = strtr($str, $GLOBALS["carateres_latinos"]);
return $str;
}
Lo que hace la función, en líneas generales, es crear un array asociativo, con todos los caracteres que se desean convertir y su correspondiente carácter especial HTML. Luego se utiliza la función strtr para cambiar en un string todas los caracteres del array creado anteriormente.
Para obtener el array asociativo con todos los caracteres (en realidad sólo los que se traducen en códigos especiales) y sus correspondientes caracteres especiales, podríamos hacerlo a mano, definiendo por nosotros mismos la variable del array e insertando cada uno de los items. Pero en este ejemplo se utiliza otra función de PHP:
get_html_translation_table(): Esta función devuelve un array asociativo que se usa en las funciones htmlspecialchars() y htmlentities() para convertir esos caracteres. Recibe dos parámetros, aunque el segundo es opcional. El primer parámetro es una constante HTML_ENTITIES o HTML_SPECIALCHARS, para conseguir el array asociativo que utilizan cada una de esas funciones. El segundo parámetro sirve para indicar el estilo de comillas que se desea obtener en el array. Con la constante ENT_NOQUOTES indicamos que no ponga en el array las comillas simples ni las dobles.
Así pues, con las líneas:
$todas = get_html_translation_table(HTML_ENTITIES, ENT_NOQUOTES);
$etiquetas = get_html_translation_table(HTML_SPECIALCHARS, ENT_NOQUOTES);
Conseguimos dos arrays, uno con todos los caracteres HTML y otro con sólo los caracteres que afectan a las etiquetas. Luego, haciendo la diferencia de el primer array menos el segundo obtendremos el array con todos los caracteres que nos interesan.
Lo que veis de $GLOBALS["carateres_latinos"], sirve para meter en una variable global ese array y luego no tener que volver a generarlo las sucesivas veces que se llama a la función.
Por último utilizamos la mencionada función srttr() para hacer la traducción de los caracteres contenidos en el array.
Una llamada a esta función como esta:
convertir_especiales_html('<p align="center">La ejecución de esta función sirve para <b>convertir caracteres especiales con PHP</b> sin tocar las etiquetas. <br>Parece que funcionó!</p>');
Devolvería un texto como el siguiente:
<p align="center">La ejecución de esta función sirve para <b>convertir caracteres especiales con PHP</b> sin tocar las etiquetas. <br>Parece que funcionó!</p>
Quizás se me ha quedado un poco largo este artículo, aunque ya sabéis que en desarrollo web .com nos gusta explicar las cosas con calma para que se puedan entender perfectamente. Esperamos que esta función pueda resultar de utilidad.
Miguel Angel Alvarez
Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...