如何从 JavaScript 中的字符串中提取基本 URL?

IT技术 javascript regex string url
2021-02-04 14:29:38

我试图找到一种相对简单可靠的方法来使用 JavaScript(或 jQuery)从字符串变量中提取基本 URL。

例如,给定如下内容:

http://www.sitename.com/article/2009/09/14/this-is-an-article/

我想得到:

http://www.sitename.com/

正则表达式是最好的选择吗?如果是这样,我可以使用什么语句将从给定字符串中提取的基本 URL 分配给新变量?

我已经对此进行了一些搜索,但是我在 JavaScript 世界中找到的所有内容似乎都围绕使用location.host或类似方法从实际文档 URL 收集此信息

6个回答

编辑:有些人抱怨它没有考虑协议。所以我决定升级代码,因为它被标记为答案。对于那些喜欢单行代码的人……很抱歉,这就是我们使用代码最小化器的原因,代码应该是人类可读的,而且这种方式更好……在我看来。

var pathArray = "https://somedomain.com".split( '/' );
var protocol = pathArray[0];
var host = pathArray[2];
var url = protocol + '//' + host;

或者使用下面的Davids 解决方案

感谢您的回复,但同样,我试图从字符串中提取基本 URL,而不是实际的文档 URL。我不认为这对我有帮助 - 但如果我错了,请纠正我。
2021-03-26 14:29:38
pathArray = String(" YourHost.com/url/nic/or/not").split ( '/' ); 主机 = pathArray[2];
2021-03-26 14:29:38
为什么所有的变量声明? url = 'sitename.com/article/2009/09/14/this-is-an-article'; newurl = 'http://' + url.split('/')[0];
2021-03-27 14:29:38
明白了 - 感谢 Rafal 和 daddywoodland!我最终使用: url = ' sitename.com/article/2009/09/14/this-is-an-article '; pathArray = (url).split('/'); 主机 = 'http://' + pathArray[2]; 我认为 Rafal 的示例只是省略了我正在处理的所有字符串中存在的“http://”,在这种情况下,pathArray[2] 是您需要的。如果没有“http://”前缀, pathArray[0] 将是一个。再次感谢。
2021-03-29 14:29:38
pathArray = window.location.href.split('/'); 协议 = pathArray[0]; 主机 = pathArray[2]; url = 协议 + '://' + 主机;//now url === "http:://stackoverflow.com" 查看::
2021-04-10 14:29:38

基于 WebKit 的浏览器、Firefox 21 版和当前版本的 Internet Explorer(IE 10 和 11)实现location.origin.

location.origin包括协议和可选的 URL端口

例如,location.originURL 的http://www.sitename.com/article/2009/09/14/this-is-an-article/http://www.sitename.com

要定位不支持location.origin使用以下简洁 polyfill 的浏览器

if (typeof location.origin === 'undefined')
    location.origin = location.protocol + '//' + location.host;
实际上, window.location.hostname 仍然有用,就像在我的情况下一样,您需要提供不同的端口号。
2021-03-28 14:29:38
window.location.hostname如果给定,将错过端口号,因此请使用window.location.host. 因此,包括尾部斜杠在内的完整“基本名称”将是:window.location.protocol+"//"+window.location.host + "/";
2021-03-29 14:29:38

不需要使用jQuery,只需使用

location.hostname
这将不包括协议和端口。
2021-03-29 14:29:38
谢谢 - 但是我不能用字符串来使用它,可以吗?我的理解是这只适用于文档 URL。
2021-04-07 14:29:38

没有理由进行拆分以从作为链接的字符串中获取路径、主机名等。你只需要使用一个链接

//create a new element link with your link
var a = document.createElement("a");
a.href="http://www.sitename.com/article/2009/09/14/this-is-an-article/";

//hide it from view when it is added
a.style.display="none";

//add it
document.body.appendChild(a);

//read the links "features"
alert(a.protocol);
alert(a.hostname)
alert(a.pathname)
alert(a.port);
alert(a.hash);

//remove it
document.body.removeChild(a);

您可以使用 jQuery 附加元素并读取其属性轻松完成此操作。

更新:现在new URL()有简化它

const myUrl = new URL("https://www.example.com:3000/article/2009/09/14/this-is-an-article/#m123")

const parts = ['protocol', 'hostname', 'pathname', 'port', 'hash'];

parts.forEach(key => console.log(key, myUrl[key]))

在这种情况下,我们假设整个站点都在 jqUERY 上运行,kquery 确实会简化事情。
2021-04-04 14:29:38
当您已经在几个字节中展示了如何在没有 jQuery 的情况下进行操作时,为什么还要添加 50K 的 jQuery?
2021-04-09 14:29:38
因为海报说他们正在使用 jQuery。
2021-04-13 14:29:38
啊,是的,够公平的。虽然当它像这样简单时,我认为使用 jQuery 会添加的额外抽象层没有任何value。
2021-04-13 14:29:38
Ewww...这不是最好的方法...如果从 window.location.href 中提取,请使用 window.location。否则,请使用正则表达式。
2021-04-13 14:29:38
var host = location.protocol + '//' + location.host + '/';
这应该被认为是正确的答案 - 它保留了协议
2021-03-15 14:29:38