Voici la situation dans laquelle je me trouvais cet après-midi. Nous avons développé un site web qui repose sur une base de données PostgreSQL. Certains formulaires du CMS possèdent des champs text qui sont interfacés avec un contrôle RTE (Rich Text Editor) comme TinyMCE. Le contenu créé par ce contrôle génère du HTML pour la mise en page (paragraphes, gras, italique, style, etc) qui est stocké tel quel dans la base de données.
Pour implémenter une fonction de recherche dans le contenu des tables, on effectue une requête SQL avec une clause LIKE, ILIKE ou SIMILAR TO sur le champ text. Ce qui veut dire qu'il est possible que des enregistrements soient proposés comme résultats alors que le mot clé de la recherche ne corresponde pas au texte mais bien à une portion du code d'une balise HTML.
Assez ordinaire non ? Heureusement, j'ai trouvé du code que j'ai encapsulé dans une fonction pour retirer les balises HTML d'une chaîne de caractère passée comme argument. Elle utilise les fonctions natives des expressions régulières de Postgres. Pour le moment, contentez-vous de l'utiliser. Moi-même, je tenterai de la comprendre plus tard.
CREATE OR REPLACE FUNCTION "public"."strip_tags" (
text
)
RETURNS text AS
$body$
SELECT regexp_replace(regexp_replace($1, E'(?x)<[^>]*?(\s alt \s* = \s* ([\'"]) ([^>]*?) \2) [^>]*? >', E'\3'), E'(?x)(< [^>]*? >)', '', 'g')
$body$
LANGUAGE 'sql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER;
Ah ouais, c'est quand même de la grosse regex qui fait bien mal au crâne ça...
Bonjour,
je viens de mon coté de faire une fonction complémentaire qui remplace les codes html des caractères spéciaux par ces caractères :
http://sig.cenlr.org/creation_bdd/fonctions/no_html_special_char