MySQL 正则表达式用于在正文中查找带有双斜杠的内部 URL

Posted

技术标签:

【中文标题】MySQL 正则表达式用于在正文中查找带有双斜杠的内部 URL【英文标题】:MySQL Regular Expression for Finding internal URL's with a Double Slash in the Body 【发布时间】:2013-01-13 12:03:45 【问题描述】:

我们有一个使用 wordpress 的网站,我们发现在某些时候,一个错误的插件或用户错误在 siteurl 之后添加了双斜杠(例如,http://example.site//category1/http://example.site/category1//category2/ 等。

这似乎可行,但似乎没有足够的结果。

SELECT id, post_content
FROM `wp_posts`
where post_content
regexp '(href="[^"]*[^:]\/\/[^"]*)'
and post_status  in('draft','publish')
order by id asc

有没有更好的方法来做到这一点?我不希望它与 http: 之后的双斜杠匹配,因此 :. 上的否定匹配。

编辑:为澄清起见,我想查找所有帖子(wordpress 帖子/页面的正文),其 url 硬编码到具有双斜杠的页面中,但在 http 后的双斜杠上不匹配:.

正则表达式应匹配以下内容: http://example.site//category1/http://example.site/category1//category2/ 甚至 http://example.site/category1/category2//example.site/category1//category2/

但不应匹配以下内容: http://example.site/category1/http://example.site/category1/category2/

【问题讨论】:

添加另一组斜线:[^"]*[^:]\/\/.*?\/\/ 这样它会寻找两组双斜线? ***.com/questions/13990256/… 一个简单的 LIKE 怎么样:WHERE post_content LIKE '%site.com//%' @bonCodigo:如果斜杠不在 URL 的末尾,那也无济于事。 那篇文章中有一个答案,它甚至谈到了//.. 【参考方案1】:

也许这样的事情会起作用。

SELECT *
FROM wp_posts
WHERE CASE WHEN instr(post_content,'http://') > 0 THEN 
  substring(post_content,7) regexp '\/\/'
ELSE
  post_content regexp '\/\/'
END

这里是SQL Fiddle。

祝你好运。

【讨论】:

+1 使用INSTR【参考方案2】:

你可以使用:

regexp '(https?:\/\/|www\.)[^ ]*\/\/'

这将匹配包含http[s]://www. 后跟非空格字符(其中包含//)的帖子。

见SQLFiddle(改编自 sgeddes 的小提琴)。

或者您可以将您的正则表达式简化为 '[^:]\/\/' 并查找包含该内容的帖子。

【讨论】:

以上是关于MySQL 正则表达式用于在正文中查找带有双斜杠的内部 URL的主要内容,如果未能解决你的问题,请参考以下文章

js小知识 正则表达式的定义

python 正则表达式中反斜杠()的麻烦和陷阱

修改正则表达式以在带有或不带有 http 前缀的字符串中查找 URL [重复]

python 正则表达式中反斜杠()的麻烦和陷阱 (转)

正则表达式:向后看以避免奇数个连续的反斜杠

sed命令和正则表达式