我正在尝试提取 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 个捕获组 - (.*?)(\/.*)
谁能告诉我哪里出了问题。请不要链接到完整的 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/