提取 URL 的正则表达式

有个朋友问我一个在复杂文本中提取 URL 的正则表达式,在网上搜索了一下,鼓捣了好久,综合了多方资源,写出这么一个正则表达式:

(?<![a-zA-Z0-9://])((http|https|ftp):)?([A-Za-z0-9-]+/.)+[A-Za-z]{2,}(:[0-9]+)?[.//=/?%/-&_~`@[/]/':+!]*([^/"/"])*?(?![//=/?%/-&_~`@[/]/':+!A-Za-z0-9.])

加上点注释,我们来分析下:

(?<![a-zA-Z0-9://])(?#去掉左侧无用字符)
((http|https|ftp):)?(?#协议)
([A-Za-z0-9-]+/.)+(?#域名)
[A-Za-z]{2,}(?#TLD)
(:[0-9]+)?(?#端口号)
[.//=/?%/-&_~`@[/]/':+!]*(?#分隔符)
([^/"/"])*?(?#网址)
(?![//=/?%/-&_~`@[/]/':+!A-Za-z0-9.])(?#去掉右侧无用字符)

于是能看懂了么?

测试了些正常的 URL,都很正确。

  • http://orzfly.com/
  • http://orzfly:8080/orztech.php?tel=123456
  • https://orzfly.com/
  • http://www.williamlong.info/script/common.js
  • relatedlinks.googlelabs.com/client/client.js?url=shcom&referrer=&relatedlinks_id=10065_599317151813484&title=
  • ……

测试了些不正确的 URL:

  • www.1/a.exe:没有匹配,正确。
  • www.1@22.ci:没有匹配,正确。
  • 123%ww.com:没有匹配,正确。
  • www.煞笔.com:没有匹配,不正确。应该能匹配,但是由于支持国际域名难度较大,抛弃。
  • www.a/b.cc:没有匹配,正确。
  • g.cn/a/b.exe:没有匹配,正确。
  • www.g.cnmmmg.cnlllhttp:123.123.123.123:80hhhwok.cshdn.comsdfsdf:能完整匹配,但是这个肯定不正确。求高人指点。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值