1

I would like to run this type of query on my WP database to remove all span instances with id="more-":

UPDATE wp_posts SET post_content = REPLACE (
post_content,
'<p><span id="more-35075"></span></p>',
'');

But the number that follows the 'more-' in my example is a variable. How to write this query with someting like a wildcard: span id="more-*.

Thank you

9
  • Are you using MySQL server version 8.0 and above ? Commented Nov 13, 2018 at 16:14
  • A better question imo is why you're storing html in a database vs storing just the id and the post content. Then you can use your application to format the HTML Commented Nov 13, 2018 at 16:15
  • Manipulating HTML with MySQL may work in extremely trivial cases, but anything even remotely complex is basically impossible without a proper HTML parser. Commented Nov 13, 2018 at 16:17
  • @Rogue he is not storing. Wordpress is storing it (table name is wp_posts); most likely OP has no control over it. Commented Nov 13, 2018 at 16:19
  • Surely whatever wordpress plugin he is using has some way of being manipulated to not do ... well awful things? Commented Nov 13, 2018 at 16:20

1 Answer 1

2

In MySQL version 8.0 and above, you can use REGEX_REPLACE() function. In absence of the same, some complicated string operations can be done. This is based on your confirmation, that the said sub-string is occurring only once in a value.

REPLACE() does not have any support for wildcards, patterns, regular expressions etc. It only replaces a given fixed substring with another fixed substring, in a bigger string.

Instead, we can try to extract portions of the post_content. We will extract the leading substring before the '<p><span id="more-' using Substring_Index() function. Similarly, we will extract the trailing substring after the '"></span></p>' portion.

Now, we can simply Concat() these portions to get the required post_content. You can find details of various String functions used here: https://dev.mysql.com/doc/refman/8.0/en/string-functions.html

I have also added a WHERE condition, so that we pick only those rows which match our given substring criteria.

UPDATE wp_posts 
SET post_content = 
CONCAT( 
       SUBSTRING_INDEX(post_content, 
                       '<p><span id="more-', 
                       1), 
       SUBSTRING(post_content, 
                 LOCATE('"></span></p>', 
                        post_content, 
                        LOCATE('<p><span id="more-',
                               post_content)
                        ) + 13) -- 13 is character length of "></span></p>
      )
WHERE post_content LIKE '%<p><span id="more-%"></span></p>%';

Query #1: Data before Update operations

SELECT * FROM wp_posts;

| post_content                                            |
| ------------------------------------------------------- |
| adasdaadsa<p><span id="more-35075"></span></p>121324124 |
| 1412123123<p><span id="more-232"></span></p>adasdaafas  |

Query #2: Data after Update operations

SELECT * FROM wp_posts;

| post_content         |
| -------------------- |
| adasdaadsa121324124  |
| 1412123123adasdaafas |

View on DB Fiddle

Sign up to request clarification or add additional context in comments.

3 Comments

Hello Madhur. Thank you for your help! I launched the SQL query but I get the message: 0 rows affected.
@APEWAW can you setup a db-fiddle.com Also check the DB fiddle links I have shared. Maybe there is something different in your sample data.
My fault! There were not always <p> tags, so I adapted the query and it worked perfectly. A big thank you for your very valuable help!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.