有个朋友问我一个在复杂文本中提取 URL 的正则表达式,在网上搜索了一下,鼓捣了好久,综合了多方资源,写出这么一个正则表达式:
1 | (?<![a-zA-Z0-9:/])((http|https|ftp)://)?([A-Za-z0-9-]+.)+[A-Za-z]{2,}(:[0-9]+)?[./=?%-&_~`@[]':+!]*([^""])*?(?![/=?%-&_~`@[]':+!A-Za-z0-9.]) |
加上点注释,我们来分析下:
1 2 3 4 5 6 7 8 | (?<![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.1a.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:能完整匹配,但是这个肯定不正确。求高人指点。
参考资料:
你知道怎么弄那个Ajax提交评论的效果么?
嘻嘻,你也用这个在链接前面加图标的效果啊?是使用的Google缓存的那个服务么?
@xiao3 , Ajax提交评论?不清楚。我的博客有么?我甚至连这个都不知道。
那个链接前加图标的效果,是直接从你代码里挖掉的……所以呢,也是用的Google缓存的。倘若直接输出 http://omgxxx.xxx/favicon.ico 的图片这样加载速度太慢了。……这个代码有很多问题,很多不该加图标的也加了……
貌似我打开Emeditor自定义宏,输入你说的这正则,出现语法错误。
我别的地方找来的正则,貌似很管用,有2种分别如下。
([w-]+.)+[w-]+(/[w- ./?%&=]*)?
http(s)?://([w-]+.)+[w-]+(/[w- ./?%&=]*)?
@hapi , 请问下您的EmEditor版本是多少?我这里一切正常啊。
正常搜索很准确了,要是用在这个宏里,http://www.cppblog.com/woaidongmao/archive/2010/10/02/65720.html,搜索的时候提示16行出错。
你好,在em搜索框里的结果很准确,用这个宏http://www.cppblog.com/woaidongmao/archive/2010/10/02/65720.html就会出现错误了。
有明显缺陷,域名中允许出现减号,例如:
http://www.great-china.com
则不能成功匹配。
Well, I don’t think so. It might depend on the RegExp Engine.
Pingback: 求一个提取网址的正则表达式 - C# - 开发者
在NotePad++中使用了一下,notepad++直接Crash了。貌似不支持Notepad++的一些规则。