1 由来 看到两篇关于url正则的不错文章:正则表达式匹配URL,正确匹配URL的正则表达式 2 解析

第一篇属于比较正常通用的思维,匹配url的各个部分,ip形式、端口等;第二篇比较抽象,个人理解应该是作者默认:像http://这样的字符后面跟上英文、数字等就是url(事实上也就是这样)。下面就个人解析一下上面的正则。

url格式:

URL由三部分组成:资源类型、存放资源的主机域名、资源文件名。 URL的一般语法格式为: (带方括号[]的为可选项): protocol :// hostname[:port] / path / [;parameters][?query]#fragment

2.1 第一个:

((http|ftp|https)://)(([a-zA-Z0-9\._-]+\.[a-zA-Z]{2,6})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,4})*(/[a-zA-Z0-9\&%_\./-~-]*)?

赤:协议

橙:字母host,前半部分(+号及以前)host、二级域名,后半部分表示一定有类似.cn、.com、.net的跟在后面

黄:找不着了。。。

绿:IP host,可以进一步简化([0-9]{1,3}(\.[0-9]{1,3}){3})

橙、绿组合成hostname

青:端口

蓝:/path及后面内容,第一个/匹配host后紧跟的斜杠,host后可能有 / ,/ 后可能还有n多字符,当然,也可能没有了。最后四个字符/-~-有些问题,/的ASCII码为47,~的为126,(ASCII码表)这之间包括了数字、大小写字母(与前面的重复),还有些如<>=?{},这些在正常的url中也会被编码的,不会出现在url中,中括号中的 - 如果不成组就表示 - 字符(一般放在中括号两边或加转义)

容易理解,可以满足大部分需求,不能匹配url+锚点、ftp有user:pass@host的情况

2.2 第二个:

(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]

橙:只能以这些字符结尾

赤:不能以这些字符结尾(比后面橙色多出的),都是一些标点,应该是避免把英文环境下url后面的标点也识别进来。

事实上,正常url中含有各种特殊字符还是比较少的,有的话也是编码以后才提供给用户的。

3 其他

关于文中提到的这个方法(https?|ftp)://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?在PCRE模式下结果是和上文第一个一样的,并不存在汉字问题。

4 验证例子

下面附录用于验证的一些例子,匹配所用软件为RegexBuddy

正常域名http://www.aa.com正常 正常域名+端口http://www.test.com:80/aaa/bbb.aspx?id=5&name=kelli 后面有斜杠http://www.aa.com/ 后面有斜杠ftp://www.aaa.com/ 后面英文逗号http://www.aa.com, 后面紧跟中文标点符号http://www.aa.com,(中文逗号) 前面文字ftp://12.34.56.78/test.html后面文字 IP地址https://12.34.56.245/test.html 英文单词hello world.com 前面有空格 ftp://11.11.11.11/files/aaa.zip后面有汉字 带有参数http://www.aa.com/?a=a&c=c&tag=a_c 带有参数http://www.aa.com/index.php?c=55&a=dd后面文字 没有www:http://top.aa.com/a.php?c=dealer/index 锚点:http://a.com/c/15/#hot 编码后的urlhttp://www.test.com/niu/niu=%E7%89%9B(niu=牛) ftp账号:密码@主机:端口/路径/文件 ftp://user:pass@host.com ftp://fulldown:fulldown@211.99.204.87:3333/test/test.txt 一段干扰文字如:以http://或https://开头的是链接地址 网页源码摘录:

background:url(https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/static/protocol/https/home/img/icons_c3b33b92.png) no-repeat 4px 3px;
 {domain : "https://ss0.bdstatic.com/9uN1bjq8AAUYm2zgoY3K_/",b64Exp : -1,pdc : -1}
 <a href="http://news.baidu.com" name="tj_trnews" class="mnav">新闻</a><a href="http://www.hao123.com" name="tj_trhao123" class="mnav">hao123</a>

 href="http://cache.baiducontent.com/c?m=9d78d513d9d431a54f9991697b12c0101d4381137b978e013894cd47c9221d03506790a63a675541c4c50b365dff1701bfb1217240527de886b0df1e89fbc56347d274696d4fc61048885df8d64627c32b8d59eab21be7a7b165d7f99280814353bc165631c1e78b2c5d40dd6f864166bff1d91b53044ceffa3013b819293e9f5510e11ba8ba6d3d47d8e1dd2a0c946b973f5780af42ea784deb&p=882a9644d38012a05aa5dc68570a8e&newp=9b769a478e870bc308e2977f080588231610db2151d4d2146b82c825d7331b001c3bbfb423231302d6c1796404ac495de8f436793d092ba3dda5c91d9fb4c57479d0637e1c&user=baidu&fm=sc&query=%B8%F7%D6%D6url&qid=9ba6e8a80001df7c&p1=17"