javascript - Javascript 的 URL 解析问题

标签 javascript regex

我正在尝试提取 url 权限(没有协议(protocol)和 www. 如果存在)及其后的所有内容(如果存在)。到目前为止我的正则表达式:

/^(?:http|https)?(?::\/\/)?(?:www\.)?(.*?)(\/.*)/;

这适用于包含所有内容的 url,例如:

http://www.site.com/part1/part2?key=value#blub

但是如果我将路径捕获组标记为可选:

/^(?:http|https)?(?::\/\/)?(?:www\.)?(.*?)(\/.*)?/

它不再匹配了。为什么?

现在如果我让第一个变体匹配:

http://site.com

它提取 : 作为第一个值(权限)和 //site.com 作为第二个(路径)。

我没想到它会起作用,因为它没有路径,而且路径也没有标记为可选。但仍然对这个结果感到疑惑,因为我只有这 2 个捕获组 - (.*?)(\/.*)

http://jsfiddle.net/U2tKT/1/

谁能告诉我哪里出了问题。请不要链接到完整的 url 解析解决方案,我知道有很多这样的链接,但我想了解我的正则表达式有什么问题(以及我如何解决这个问题)。

谢谢。

最佳答案

user1436026 在我正要点击提交按钮之前发布,但这里是:

你的域(权限)模式被标记为“不贪婪”,匹配越少越好。在您的情况下,它实际上满足了完全不匹配任何内容的模式-几乎没有。相反,您想要的是尽可能多地匹配域,直到您确定它匹配的不再是域(我更改了正则表达式以匹配除/之外的任何内容,并尽可能多地匹配。)

/^(?:http|https)?(?::\/\/)?(?:www\.)?([^\/]+)(\/.*)?/

我知道您明确表示您不希望任何链接指向 JS 中的任何 URL 解析解决方案,但您知道 JS 已经内置了它吗? :)

var link = document.createElement('a');
link.href="http://www.site.com/part1/part2?key=value#blub";
auth=link.hostname; //www.site.com
path=link.pathname; // /part1/part2

关于javascript - Javascript 的 URL 解析问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18533869/

相关文章:

javascript - 获取div中所有选中复选框的id

java - 给定一个字符串,在第 50 个位置插入一个新的换行符并排除整个单词

ruby-on-rails - ruby 正则表达式 : why does this code not replace what is found but simply insert

嵌套在字符类中的 Java 正则表达式预定义字符类

javascript - Typescript 提示没有分配 get 属性

javascript - jQuery:重构惰性代码

javascript - 如何让javascript变量被解释为下划线模板中的属性

javascript - 获取 URL 中的最后一个数字

java - 替换java中的某些字符

javascript - 几个正则表达式查询