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的主要内容,如果未能解决你的问题,请参考以下文章