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.
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"), ' ', ' ') ,"//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   con uno spazio.