You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正则URL解析适配问题:调整WordPress正则匹配http/https/ftp链接

搞定WordPress正则匹配URL的小问题

咱先说说你遇到的问题根源哈:你原来正则里的协议部分写的是[\w]{1,20}+://,这规则会把任意1-20个字母/数字/下划线都当成协议前缀的一部分,所以碰到testhttp://google.com时,testhttp会被直接匹配进去,自然就把前面的test也带进来了。你后来改的(http|https|ftp)+://多了个+,这会匹配重复的协议(比如httphttp://),完全没必要。

给你两个关键修改点,直接解决问题:

  • 把协议部分改成明确匹配:(http|https|ftp)://,精准锁定你要的三种协议
  • 加上(?<!\w)这个负向后行断言,确保协议前面不会跟着字母、数字或者下划线(这样就不会把前面的普通字符误包含进来)

调整后的正则片段大概是这样的:

~ (?<!\w) # 保证协议前面不是单词字符,避免误抓前面的内容
( # 捕获我们要的URL
(http|https|ftp):// # 明确匹配合法协议
(?=\S{1,2000}\s) # 保留你原来的URL长度限制规则
[\S]+ # 匹配URL的剩余内容,可根据实际需求调整
)~

拿你的例子testhttp://google.com测试的话,(?<!\w)会直接排除test后面的t(因为t属于单词字符),所以只会精准匹配http://google.com,完全符合你的预期。

要是你还想保留原来匹配开头分隔符(空白或标点)的逻辑,可以再调整下开头:

~ (?:[\s(<.,;:!?]|^) # 匹配开头的分隔符,或者字符串的起始位置
(?<!\w) # 依然要保证协议前无单词字符
( # URL捕获组
(http|https|ftp)://
(?=\S{1,2000}\s)
[\S]+
)~

这里用(?:...)把分隔符改成非捕获组,避免多出来没用的捕获结果;加|^是为了确保字符串最开头的URL也能被匹配到。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:58:00