如何搜索内容但跳过方括号内的内容?

时间:2019-01-19 22:47:59

标签: mysql sql

我需要在"表中找到所有带有双引号post_content的帖子

SELECT * FROM `pl_posts` WHERE `post_content` LIKE '%"%'

这是一个WordPress网站,因此我得到几千行,因为每个帖子都包含短代码,最常见的是以下代码:

[gallery columns="4" ids="22502,22504,22503"]

我如何搜索post_content表中的所有内容,但跳过了方括号[...]中的内容?

1 个答案:

答案 0 :(得分:3)

WHERE子句可能有几种解决方案,具体取决于您的数据。

选项1:仅跳过内容包含方括号的记录

post_content LIKE '%"%' AND post_content NOT LIKE '%[%'

选项2:如果您将带有双引号oustide AND的字段混合在一起并且在方括号内,则解决方案是在对双引号进行定位之前删除方括号内的所有内容

REGEXP_REPLACE(txt, '\\[[^\\]]*\\]', '') LIKE '%"%'

正则表达式的意思是:一个左括号,后跟一个不同于右括号的O到N个字符,然后是一个右括号。

选项3:在功能上与选项2相同,但是使用REGEXP_REPLACE和更复杂的正则表达式:

REGEXP_LIKE(txt, '(^|\\])[^\\[\\]]*"')

对于旧版本的MySQL(<8.0.4),可以这样写:

txt REGEXP '(^|[[.right-square-bracket.]])[^[.left-square-bracket.][.right-square-bracket.]]*"'

db <>提琴here

 WITH tests as (
     SELECT '[columns="4"]' txt
     UNION SELECT 'abc"db'
     UNION SELECT 'abc"db[columns="4"]'
     UNION SELECT '[columns="4"]abc"db'
     UNION SELECT '[columns="4"]abc"db[columns="4"]'
 )
 SELECT 
     txt, 
     txt NOT LIKE '%[%', 
     REGEXP_REPLACE(txt, '\\[[^\\]]*\\]', '') LIKE '%"%',
     REGEXP_LIKE(txt, '(^|\\])[^\\[\\]]*"')
 FROM tests

 txt                              | txt NOT LIKE '%[%' | REGEXP_REPLACE(txt, '\[[^\]]\]', '') LIKE '%"%'    | REGEXP_LIKE(txt, '(^|\])[^\[\]]"')
 :------------------------------- | -----------------: | --------------------------------------------------: | -------------------------------------:
 [columns="4"]                    |                  0 |                                                   0 |                                      0
 abc"db                           |                  1 |                                                   1 |                                      1
 abc"db[columns="4"]              |                  0 |                                                   1 |                                      1
 [columns="4"]abc"db              |                  0 |                                                   1 |                                      1
 [columns="4"]abc"db[columns="4"] |                  0 |                                                   1 |                                      1