Para filtrar el (X)HTML que se muestra en "SMC" (los habituales sabéis a qué me refiero, los no habituales... tal vez es mejor que no sepáis a qué me refiero), es decir, cuando se imprime el título de una entrada, o el nombre de su autor, por ejemplo, es preciso asegurarse de que su contenido no resulta "peligroso".

Para esto vengo usando la siguiente función desde hace ya un par de proyectos, que no sé si "aprendí" en BuayaCorp... no lo recuerdo bien:

function String2Htm($input, $charset = 'utf-8'){
  return htmlentities(strip_tags(
    stripslashes($input)), ENT_QUOTES, $charset
  );
}

Sin embargo, hay cierto contenido que no puede "pasarse" por esa función sin más, como, por ejemplo, el propio contenido de una entrada, o el de un comentario. ¿Por qué? Pues porque la función elimina todas y cada una de las etiquetas (X)HTML que se pasa a la función, entre otras cosas.

Pero, hay veces en que es menester conservar las etiquetas (X)HTML, y, mejor aún, conservar sólo algunas de ellas. De esta manera, el contenido de entradas y comentarios "admite" algunas etiquetas (X)HTML, pero, con el fin de conseguir "negritas", "cursivas", "encabezados", "listas", etc., nada más,... y nada menos.

El proyecto WordPress.org usa algunas clases que yo también uso o pienso usar en SMC, más o menos modificadas, y que conozco desde hace tiempo, incluso antes de conocer a WordPress, es decir, clases como la increíble ezSQL de Justin Vincent, ya digo, más o menos modificada, y que no sólo usan en WordPress, sino en proyectos como Menéame (o al menos usaban la última vez que eché un vistazo al código fuente).

Algunas clases como Snoopy (cliente HTTP escrito en PHP), por ejemplo, sé que acabaré usándola en SMC, porque ya la usé en otros proyectos, porque sus resultados son estupendos, sencillamente. O como PHP Gettext, de la que hace poco hablé aquí, y que sirve para localizar SMC... y también Wordpress y otros muchos proyectos.

Pues bien, queriendo averiguar cómo se las ingeniaban en Wordpress para "filtrar" el contenido de una determinada entrada, porque no me quedaba muy claro cómo hacerlo, me he encontrado con otra maravillosa clase para PHP: se trata de KSes, escrita por Richard R. Vásquez Jr..

Esta clase tiene como objetivo filtrar de una determinada cadena todas y cada una de las etiquetas (X)HTML "no permitidas". Simple y llanamente, pero, se ve que está bastante trabajada, que es bastante completa, que funciona muy bien, y que su uso no resulta para nada complicado. Aquí va un sencillo ejemplo:

$allowedTags = explode(
  ',',
  'strong,em,ul,ol,li'
);
 
$kses = new KSes();
 
foreach($allowedTags as $tag){
  $kses->AddHTML($tag);
}
 
$filterContent = $kses->Parse($content);

Así que, como no podía ser de otro modo, he adoptado a KSes para SMC (parece esto ya la ONU), y me he quitado de veras un pequeño peso de encima, puesto que sabía que tarde o temprano me iba a enfrentar al "filtrado" del contenido de las entradas y comentarios. Ea.

El ejemplo de uso que he puesto más arriba no muestra todas las características de KSes, que también permite permitir (¿valdrá la redundancia aunque fea?), digo, diferentes "protocolos", de modo que puedan incluirse enlaces "HTTP", "HTTPS", "FTP", "MAILTO", etc. Y también permite filtrar no ya etiquetas (X)HTML, sino también todos o algunos de sus atributos.

Además KSes se presenta para usarse mediante sencillas "funciones", o mediante clases, tanto para PHP4 como para PHP5, se acompaña de ejemplos, documentación y "test" de pruebas. ¿Alguien da más?