Infocurci - programmatore Php Roma
Infocurci - programmatore Php Roma
"faster than 98% of all tested websites" (tools.pingdom.com) - 100/100 Google PageSpeed Insights - Benvenuti :)

Mysql : Ripulire un campo dai tag html

Spesso nei campi testuali di un database troviamo dei valori pieni di tag html. Ecco come estrarre il solo dato testuale, in maniera analoga alla funzione strip_tags di php. A fine articolo ho aggiunto anche un fix per utilizzare la funzione in caso di html mal formattato.

Mysql

La diffusione del supporto agli editor wysiwyg da parte di tutti i browser ha agevolato l'utilizzo di tags html nella fase di data entry dei contenuti nel web. L'altra faccia della medaglia del salvataggio dei tags dentro colonne nel database è la difficoltà nell'estrazione dei soli dati testuali, al netto dei codici html.

Dalla versione 5.5 Mysql ha introdotto una comodissima funzione che restituisce il valore testuale, in maniera analoga a quanto avviene con php attraverso la nota funzione strip_tags().

Per estrarre il valore testuale da una colonna contenente tags html è sufficiente utilizzare questa istruzione;

ExtractValue(nomeColonnaConCodiceHtml,"//text()")

Ipotizzando che la colonna "nomeColonnaConCodiceHtml" contenga ad esempio la stringa "Ciao <b>mondo</b>,<br />che tempo fa <u>oggi</u>?", la query estrarrebbe la stringa:

Ciao  mondo , che tempo fa  oggi ?

Come avrete intuito il secondo parametro, "//text()", contiene una xpath_expr (chiamata "locator") che può contenere altre funzioni.

Ad esempio

SELECT ExtractValue(nomeColonnaConCodiceHtml, '//li[2]');

restituisce il secondo valore del tag <li> della colonna testuale. Se la colonna contiene il valore

<ul><li>primo</li> <li>secondo</li> <li>terzo</li> </ul>

l'istruzione restituisce:
secondo
 

Nota finale: l'istruzione si aspetta un documento xml (va bene anche testo html) ben formattato. Mi è capitato di estrarre dati da colonne contenenti il tag "<br>" (scritto cosi, e non come "<br />") e questo in xml è un errore visto che il tag necessita di chiusura. La funzione aspettava un </br> , ovviamente inesistente. In casi come questo, se i tag che generano l'eccezione sono pochi, ci si può aiutare con la funzione replace.:

ExtractValue(replace(replace(replace(nomeColonna, "<br />", "\n"), "<br>", "\n"), '&nbsp;', ' ') ,"//text()") 

in questo caso ho fatto diverse operazioni:

  • - ho sostituito il tag errato "<br>" con un "a capo" ("\n")
  • - già che c'ero, ho sostituito anche i tag <br /> scritti correttamente (mi tornava comunque utile di estrarli come "a capo")
  • - ho sostituito l'entità html &nbsp con uno spazio.