任何人都想尝试提出一个匹配两者的正则表达式:
> /foo/bar/baz.gif
> / foo / bar /
> http://www.foo.com/foo/bar
我认为用一个正则表达式做这个可能是不可能的,但你永远不会知道.
编辑:澄清一下,我要做的是从文档中挑选出所有URI(不是HTML文档).
( ((http|https|ftp)://([\w-\d]+\.)+[\w-\d]+){0,1} // Capture domain names or IP addresses (/[\w~,;\-\./?%&+#=]*) // Capture paths,including relative )
这个答案的基本原理:
>整个事情已分组,因此您可以选择整个网址
>协议部分是可选的,但如果提供,还应提供主机名或IP地址(两者都允许的字符数少于URI的其余部分).
>开头的“/”也是可选的.路径可以采用“images / 1.gif”形式,它们相对于当前路径而不是相对于主机名.
注意事项:
>不支持mailto和文件URI.
>句点跟踪的URL(例如句子末尾没有引用)将包括尾随句点.
>由于上面的#3,它将捕获各种各样的东西.如果您可以验证所有路径都不是相对的,则可以在括号外添加“/”,从而需要它.
>如果所有URI都在HTML属性(A,LINK,IMG等)中,则可以通过仅在引号内捕获或至少仅在HTML标记内捕获来更准确地定位URI.
编辑:哎呀,固定关闭paren问题.