2010-08-13 7 views
2

Salut est-il un moyen de «remplacer» toutes les occurrences de 10 occurrences ou plus de _ (soulignement) dans une table mysql avec quelque chose d'autre.Mysql remplacer l'expression régulière

background J'ai hérité d'une base de données de contenu écrite pour le web.

Malheureusement, l'auteur de l'original a utilisé ________________ au lieu de <hr /> pour les règles horizontales.

Il s'agit d'une installation wordpress donc le contenu est dans une table appelée wp_posts.

Je suis capable de trouver les messages impliqués dans la requête suivante.

SELECT * 
FROM `wp_posts` 
WHERE `post_content` LIKE '%\_\_\_\_\_\_\_\_\_\_%' 

Mise à jour:

je peux trouver les postes qui correspondent à l'aide de ce qui suit également

SELECT `post_content` 
REGEXP '_{10,}' 
FROM `wp_posts` 
WHERE `post_content` LIKE '%\_\_\_\_\_\_\_\_\_\_%' 
LIMIT 0 , 30 

Cependant qui retourne seulement 1 s'il y a un match pas 0 s'il n'y a pas .

Est-il possible de renvoyer la sous-chaîne correspondante? Existe-t-il un moyen de rendre l'expression gourmande?

+0

@Dominic Rodger Quel était le problème avec le poste que vous l'avez édité? Je veux juste savoir ce que j'ai fait de mal pour ne pas le refaire. – Wes

+0

rien de trop grave (un couple de fautes de frappe, et vous avez eu besoin de backticks autour de '


' - il ne s'affiche pas dans votre message original). Les gens autour d'ici ont tendance à éditer les choses pour les ranger - cela ne reflète pas nécessairement mal sur vous comme la question demandeur/répondeur - ce site est édité en collaboration (voir la FAQ: http://stackoverflow.com/faq) –

Répondre

4

MySQL n'a pas de remplacement d'expression régulière, mais vous pouvez faire ce que vous voulez sans lui.

Vous pouvez utiliser REPLACE pour remplacer une chaîne exacte:

update `wp_posts` set `post_content` = replace(`post_content`,'__________','<hr />'); 

Puisque c'est un unique emploi, je voudrais commencer par trouver le nombre le plus élevé de _ s utilisés pour représenter un <hr /> - si ce est 15, je voudrais d'abord exécuter cette commande SQL avec une chaîne de 15 _ s, puis avec 14, puis avec 13, puis avec ..., puis avec 10.

+0

C'est utile mais je crains que l'auteur de l'original n'ait gardé le bouton enfoncé pour la durée qu'ils jugeaient appropriée. Je pourrai peut-être utiliser regex pour trouver ces extensions et passer cela à cela. Je vais essayer. – Wes

+0

Si c'est vraiment important d'utiliser regex, vous pouvez l'installer en tant que plugin dans mysql, vérifiez ici: http://www.mysqludf.org/lib_mysqludf_preg/ –

+0

Ok, ce genre de travail pour moi. Cependant, je vais devoir refaire le travail, j'aimerais voir une solution plus propre. – Wes