Un script PHP para validar un código HTML para eliminar etiquetas no deseadas, dejando los tags permitidos.
Vamos a comentar un script realizado con PHP que consiste en un filtro de código HTML / XHTML, para validar que sólo tenga las etiquetas que deseamos, borrando todos los tags indeseables que pueda tener.
Hay veces que tenemos formularios, para entrada de datos por parte de los usuarios, en los que se pueden escribir etiquetas HTML, por ejemplo para formatear el texto. En estos casos es muy probable que deseemos permitir sólo un conjunto de etiquetas HTML, rechazando el resto. Para ello, tendríamos que analizar el código HTML escrito por el usuario para eliminar todas las etiquetas no permitidas.
No dudamos que crear un script PHP para analizar un código HTML y eliminar sólo ciertas etiquetas sería una tarea cuando menos laboriosa. Pero con Kses, el script que estamos comentando, podemos hacer esto de una manera extremadamente sencilla. Veremos en este artículo un ejemplo de funcionamiento de Kses, para limpiar el código HTML de etiquetas no permitidas.
Lo primero sería acceder a la página del proyecto en Source Forge: http://sourceforge.net/projects/kses
Allí tendremos que descargar la versión más actualizada de Kses, en el momento de escribir el artículo iban por la release 0.2.2.
Kses tiene una función principal, que es la que realiza el filtro de etiquetas HTML. Esta función recibe tres parámetros:
$texto = "<a href='hola.php' target='_blank'>enlace</a>. Esto es un <b style='font-size:120%'>texto</b>. Esto <i>italico</i>.<p>Lo que sea<sup>3</sup></p>";
Ahora tenemos este array de etiquetas permitidas:
$tags_permitidos = array('b' => array(), 'i' => array());
Es este array de tags HTML válidos sólo estamos permitiendo etiquetas <b> y etiquetas <i> , sin ningún atributo posible. Luego veremos la especificación de una lista mayor de etiquetas y atributos.
Para filtrar ese código HTML ejecutamos la función kses():
$texto_filtrado = kses($texto,$tags_permitidos);
Esto nos devolveria uma cadena como esta:
enlace. Esto es un <b>texto</b>. Esto <i>italico</i> .Lo que sea3
Vemos que sólo se han conservado las etiquetas que habíamos definido en el array y que a la etiqueta <b> aparece sin el parámetro que tenía en el código HTML original.
Ahora veamos un array de etiquetas permitidas más amplio:
$tags_permitidos = array('b' => array('style' => 1),
'span' => array('style' => 1),
'i' => array('style' => 1),
'a' => array('style' => 1, 'href' => 1, 'title' => 1),
'p' => array('style' => 1, 'align' => 1),
'br' => array(),
'blockquote' => array('style' => 1),
'li' => array('style' => 1),
'ul' => array('style' => 1),
'ol' => array('style' => 1),
'u' => array('style' => 1),
'table' => array('cellpadding' => 1, 'cellspacing' => 1, 'border' => 1, 'style' => 1),
'tr' => array('style' => 1),
'td' => array('valign' => 1, 'align' => 1, 'rowspan' => 1, 'colspan' => 1, 'style' => 1)
);
En este caso, estamos permitiendo unas cuantas etiquetas y atributos. Si filtramos el texto inicial con el código HTML de antes nos dará este resultado:
<a href='hola.php'>enlace</a>. Esto es un <b style='font-size:120%'>texto</b>. Esto <i>italico</i>.<p>Lo que sea3</p>
Como podemos ver, sólo ha eliminado la etiqueta <sup> y el atributo target='_blank' del enlace, que no estaban en el array de configuración de etiquetas HTML permitidas.
Espero que estas notas hayan sido suficientes para entender rápidamente kses, un útil filtro de etiquetas HTML, que podemos utilizar en nuestras aplicaciones PHP.
Hay veces que tenemos formularios, para entrada de datos por parte de los usuarios, en los que se pueden escribir etiquetas HTML, por ejemplo para formatear el texto. En estos casos es muy probable que deseemos permitir sólo un conjunto de etiquetas HTML, rechazando el resto. Para ello, tendríamos que analizar el código HTML escrito por el usuario para eliminar todas las etiquetas no permitidas.
No dudamos que crear un script PHP para analizar un código HTML y eliminar sólo ciertas etiquetas sería una tarea cuando menos laboriosa. Pero con Kses, el script que estamos comentando, podemos hacer esto de una manera extremadamente sencilla. Veremos en este artículo un ejemplo de funcionamiento de Kses, para limpiar el código HTML de etiquetas no permitidas.
Lo primero sería acceder a la página del proyecto en Source Forge: http://sourceforge.net/projects/kses
Allí tendremos que descargar la versión más actualizada de Kses, en el momento de escribir el artículo iban por la release 0.2.2.
Kses tiene una función principal, que es la que realiza el filtro de etiquetas HTML. Esta función recibe tres parámetros:
- Código HTML / XHTML a validar. Es uma cadena que contiene un texto mezclado con etiquetas, que es el que hay que filtrar para dejar sólo los tag permitidos.
- Etiquetas HTML permitidas. Es un array asociativo, de dos dimensiones, donde se especifican las etiquetas HTML válidas y los atributos que deseamos permitir.
- Protocolos permitidos, entre los que hay http, https, ftp, news, etc. Este campo es opcional y si no lo indicamos ya se cargan una serie de protocolos habituales. Estos protocolos se utilizan en los enlaces o las rutas de las imágenes, por ejemplo.
$texto = "<a href='hola.php' target='_blank'>enlace</a>. Esto es un <b style='font-size:120%'>texto</b>. Esto <i>italico</i>.<p>Lo que sea<sup>3</sup></p>";
Ahora tenemos este array de etiquetas permitidas:
$tags_permitidos = array('b' => array(), 'i' => array());
Es este array de tags HTML válidos sólo estamos permitiendo etiquetas <b> y etiquetas <i> , sin ningún atributo posible. Luego veremos la especificación de una lista mayor de etiquetas y atributos.
Para filtrar ese código HTML ejecutamos la función kses():
$texto_filtrado = kses($texto,$tags_permitidos);
Esto nos devolveria uma cadena como esta:
enlace. Esto es un <b>texto</b>. Esto <i>italico</i> .Lo que sea3
Vemos que sólo se han conservado las etiquetas que habíamos definido en el array y que a la etiqueta <b> aparece sin el parámetro que tenía en el código HTML original.
Ahora veamos un array de etiquetas permitidas más amplio:
$tags_permitidos = array('b' => array('style' => 1),
'span' => array('style' => 1),
'i' => array('style' => 1),
'a' => array('style' => 1, 'href' => 1, 'title' => 1),
'p' => array('style' => 1, 'align' => 1),
'br' => array(),
'blockquote' => array('style' => 1),
'li' => array('style' => 1),
'ul' => array('style' => 1),
'ol' => array('style' => 1),
'u' => array('style' => 1),
'table' => array('cellpadding' => 1, 'cellspacing' => 1, 'border' => 1, 'style' => 1),
'tr' => array('style' => 1),
'td' => array('valign' => 1, 'align' => 1, 'rowspan' => 1, 'colspan' => 1, 'style' => 1)
);
En este caso, estamos permitiendo unas cuantas etiquetas y atributos. Si filtramos el texto inicial con el código HTML de antes nos dará este resultado:
<a href='hola.php'>enlace</a>. Esto es un <b style='font-size:120%'>texto</b>. Esto <i>italico</i>.<p>Lo que sea3</p>
Como podemos ver, sólo ha eliminado la etiqueta <sup> y el atributo target='_blank' del enlace, que no estaban en el array de configuración de etiquetas HTML permitidas.
Espero que estas notas hayan sido suficientes para entender rápidamente kses, un útil filtro de etiquetas HTML, que podemos utilizar en nuestras aplicaciones PHP.
Miguel Angel Alvarez
Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...