正则表达式以匹配相对和绝对URL

时间:2009-06-15 22:20:34

标签: regex

任何人都想尝试提出一个与之匹配的正则表达式:

我认为用一个正则表达式做这件事可能是不可能的,但你永远不会知道。

编辑:澄清一下,我要做的是从文档中挑选出所有URI(不是HTML文档)。

6 个答案:

答案 0 :(得分:8)

(
  ((http|https|ftp)://([\w-\d]+\.)+[\w-\d]+){0,1}  // Capture domain names or IP addresses
  (/[\w~,;\-\./?%&+#=]*)                // Capture paths, including relative
)

这个答案的基本原理:

  1. 整个内容已分组,因此您可以选择整个网址
  2. 协议部分是可选的,但如果提供,还应提供主机名或IP地址(两者的允许字符数均少于URI的其余部分)。
  3. 开头的“/”也是可选的。路径可以采用“images / 1.gif”形式,它们相对于当前路径而不是相对于主机名。
  4. 注意事项:

    1. 不支持mailto和文件URI。
    2. 一段时间(例如句子末尾没有引用)的网址将包含尾随时段。
    3. 由于上面的#3,它将捕获各种各样的东西。如果您可以验证所有路径相对,则可以在括号外添加“/”,从而需要它。
    4. 如果所有URI都在HTML属性(A,LINK,IMG等)中,则只需在引号内捕获,或者至少仅在HTML标记内捕获,就可以更准确地定位URI。
    5. 编辑:哎呀,修复了关闭问题。

答案 1 :(得分:2)

(http:\/)?(\/[\w\.\-]+)+\/?

与Alex的相似。

答案 2 :(得分:2)

这是一个棘手的问题,因为URL中有这么多有效字符(在它们被编码之前)。

这是我的镜头:

(http:/|https:/)?(/[^\s"'<>]+)+/?

也与亚历克斯相似。我发现亚历克斯唯一的问题是,它不会像英镑符号,破折号等类似的东西。而我的将匹配所有这些。

编辑 - 实际上,唯一让它不要过于贪婪的事情就是不要匹配空格,引号,撇号或者V形符号的指令。

答案 3 :(得分:1)

(http:/)?(/[\w.]+)+/?

匹配这些,但也许你有更严格的条件?

答案 4 :(得分:0)

不容易,你最终可能会抓住“太多的URI”,但是:

((http://|https://)([^/])+)*(/([^\s])*(/))(((\w)*\.[\w]{3,10})|(\w+))?

基本上你有几个小组。关于定义协议。一个是寻找目录,一个是在最后寻找一个文件。但!这种方法非常有限。如果您需要真正的URI验证并且!分离(端口,用户名,密码,过滤掉不需要的字符!)你可能最终得到一种更复杂的表达方式。祝你好运!

<强>更新

你没有要求这个,但是对于那些来自搜索引擎的人想要了解更多有关正则表达式的信息,我想插入我用于此次尝试的免费程序“The Regex Coach”(不,不是附属的) )。

答案 5 :(得分:0)

我使用了命名捕获组。当方案存在时,我们得到更好的匹配。像www.foo.com/bar只会匹配/ bar。

(?:
  (?:(?<scheme>https?|file)://)
  (?<host>[^/]+)
  (?<path>/(?:[^\s])+)?
)
|
(?<path>/(?:[^\s])+)

这是你可以为javascript做的事情

var result = text.match(/(?:(?:(https?|file):\/\/)([^\/]+)(\/(?:[^\s])+)?)|(\/(?:[^\s])+)/g);

测试数据

sadfasdf /foo/bar/ba090z.gif asdfasdf /foo/bar/ sadfasdf asdflkj; http://www.foo.com/foo/bar some stuff http://user:pw@www.foo.com:80/r?stuff%20stuff

user:pw@www.foo.com:80/r?stuff%20stuff