我编写了一个正则表达式来匹配 URL,以便对评论系统中的帖子执行 str_replace() 并用活动的可点击链接替换裸链接。
这效果很好:
(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\??(([a-zA-Z0-9]*=[a-zA-Z0-9]*)&?)*\/?
与 URL 匹配得很好,但在这一行失败了:
“我知道,但你的名字不在名单上,看... http://screencast.com/t/ccccccc”
它与 [see... http] 部分匹配。
怎么了?
模式中与协议匹配的部分(
http://
或https://
)是可选的。另外,模式中用于匹配 URL 查询的部分(URL 中 ?
之后的部分)。
纠正这两个问题,它应该可以工作:
(https?:\/\/)([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\??(&?([a-zA-Z0-9]*=[a-zA-Z0-9]*))*
但是我们可以稍微改进一下:
(https?://)[\da-z.-]+(\.[a-z0-9-]+)+(\:\d+)?)(/[\w.-]*)*(\?\S+)?
当然,这只是一个近似值。要获得更详细和完整的模式,您可能应该阅读寻找完美的 URL 验证正则表达式,其中作者提供了许多模式并展示了它们的优点和缺点。
(https?:\/\/)([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\??(([a-zA-Z0-9]*=[a-zA-Z0-9]*)&?)*\/?