Revista Tecnología

Formas de eliminar etiquetas XML/HTML desde MySQL o MariaDb. strip_tags en MySQL

Publicado el 14 diciembre 2016 por Gaspar Fernández Moreno @gaspar_fm

Formas eliminar etiquetas XML/HTML desde MySQL MariaDb. strip_tagsFormas de eliminar etiquetas XML/HTML desde MySQL o MariaDb. strip_tags en MySQL
Estamos haciendo una consulta a una tabla, y vemos que la tabla tiene un texto. Pero dicho texto contiene etiquetas HTML que nos molestan o no deberían estar ahí (puede que el valor lo hayamos extraído de un campo WYSIWYG) y cuando vamos a extraer la información nos molesta.

Pero tenemos prisa y tendríamos que modificar o crear un programa y no tenemos tiempo. ¿Qué hacemos? Pues nada, implementar strip_tags() dentro de MySQL y luego pegarnos un baile.

Preparamos nuestra prueba

Primero vamos a preparar un ejemplo. No os puedo mostrar mi caso real porque contiene información confidencial (qué importante suena). Además, contiene muchos campos y nos sobran la mitad de los datos para el ejemplo; por tanto, vamos a crear una tabla y a meter algunos datos:

Veamos el problema

El caso es que cuando hacemos un SELECT a la tabla anterior, nos devolvería esto:

SELECT * FROM POESIA.PRUEBAS;

| id | Key | Value

| 1 | Enlace | Poesía Binaria

Que no sería gran problema si son sólo estos cuatro campos, pero se vuelve un verdadero marrón cuando son varios miles de campos. Tanto si los tiene que procesar una aplicación o vamos a exportarlos como CSV ...

Primero, pensemos

Es lo primero que hay que hacer siempre. Y es que si las etiquetas son siempre las mismas, o en definitiva son un número acotable a primera vista, es decir, sólo vemos <p> y <span> podemos utilizar un simple REPLACE y nos quitamos de líos:

| id | Key | Value

| 1 | Enlace | Poesía Binaria

| 3 | Test | This is a test.

Aunque vemos que no vale para todas las etiquetas, y por desgracia en MySQL no tenemos un método fácil para hacer muchos reemplazos juntos. Podríamos crear una tabla temporal y montar un procedimiento almacenado que guardara valores temporales de los replaces (uno por fila), pero sería muy pesado...

MariaDB y expresiones regulares

En MySQL tampoco hay una forma fácil de reemplazar con expresiones regulares. Y digo fácil, porque siempre es posible crear un módulo en C para MySQL (o bajártelo. Podemos utilizar este, aunque tiene algunos años), pero claro, en un servidor de producción no te vas a poner a compilar nada. Es más, si te pilla el sysadmin no sales vivo.

Pero si utilizas MariaDB, desde la versión 10.0.5 tenemos la función REGEXP_REPLACE() que nos ayudará con ésta y muchas otras cosas...

| id | Key | Value

| 1 | Enlace | Poesía Binaria

| 3 | Test | This is a test.

MySQL strip_tags()

Pero claro, si no vamos a instalar software en el servidor de producción y estamos utilizando MySQL, no vamos a pasarlo todo a MariaDB. Así que al menos, vamos a crear un procedimiento almacenado que nos quite las etiquetas de un campo de la base de datos y lo podamos llamar para devolver todos los campos filtrados.

La función es de Peter Brawley, que a su vez hizo un port a MySQL de una función de Robert Davis. Ahora cuando hacemos:

| id | Key | Value

| 1 | Enlace | Poesía Binaria

| 3 | Test | This is a test.


[/simterm]
Todo funciona bien.

O podríamos utilizar también esta función:

Mucho más sencilla y también efectiva ( Quién mira Stack Overflow?).

También podría interesarte...


Volver a la Portada de Logo Paperblog