Convertir los caracteres especiales con PHP, sin alterar etiquetas HTML

  • Por
Sustituir los caracteres especiales del HTML con una función PHP. Una función para convertir, todos los caracteres especiales del HTML con PHP.
Cuando hablamos de caracteres especiales del HTML, por si queda alguna duda, nos referimos a los caracteres que se tienen que sustituir en páginas web, dentro del código HTML, con sus correspondientes códigos del tipo á o " Estos los debemos de conocer ya, pero para el que no sepa cuáles son les sugiero entrar en el artículo Caracteres especiales.

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&oacute;n de esta funci&oacute;n sirve para <b>convertir caracteres especiales con PHP</b> sin tocar las etiquetas. <br>Parece que funcion&oacute;!</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.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

Ricardo

22/10/2008
Está bien, pero en lugar de usar globales, mejor usar un argumento adicional opcional.

Drhank

17/5/2010
Gracias!
Muchisimas gracias por el articulo,me salvas la vida!

DiMaN

02/6/2010
Ayuda x favor
No consgo ke me funcione, he echo una pagina de prueba
aqui le envio el codigo:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<form method="post" action="caracteres.php">
<textarea rows="6" cols="40" name="caracteres_latinos">
</textarea><br />
<input type="submit" value="Transformar" /><br />
<?php
$str=$_POST['caracteres_latinos'];
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"]);
?>
<textarea rows="6" cols="40" name="carac_e">
<?php
echo $str;
?>
</textarea>
</form>
<body>
</body>
</html>

Raul Islas Matadamas

27/4/2011
Excelente Función
Después de tanto navegar, dí con la solución a mi problema.

Muchas Gracias.

wolff

08/8/2011
gracias
Me han salvado la vida gracias

Jerant

24/10/2011
Gracias
hey gracias la verdad que me ha servido de mucho

Kevin

22/3/2012
Amazing
You are amazing, tanks you soo much!!!!!

Joel

26/6/2012
Funcion
Muchas gracias, muy util tu funcion, que ingenioso.

Renato Baez

28/7/2014
Convertir los caracteres especiales con PHP, sin alterar etiquetas HTML
funciona perfecto! GRACIAS

zzzxxxxcccc

11/11/2014
zxczxc
zxcxzczx

ayuda

13/4/2015
bbcode a html
ayuda alg un codigo para convertir codigo bbcode a html.