如何用JavaScript检查URL字符串中是否存在URL方案

3
我将尝试解决一个问题,我需要知道我的url字符串前面是否有URL方案(不仅限于http、https)。我可以执行link.indexOf(://);然后获取“://”之前的任何内容的子字符串,但是如果我有一个例如以下情况的案例:
example.com?url=http://www.eg.com

在这种情况下,substring 将返回整个字符串,即 example.com?url=http ,这是不正确的。它应该返回 "",因为我的 url 没有加上协议前缀。
我需要找出 url 是否带有协议前缀。
2个回答

5
你可以轻松地使用一点正则表达式来完成。模式/^[a-z0-9]+:\/\//将能够提取它。
如果你只想测试是否有它,使用pattern.test()得到一个布尔值:
/^[a-z0-9]+:\/\//.test(url); // true

如果你想判断它是什么,请使用url.match()并将协议部分用括号包起来:
url.match(/^([a-z0-9]+):\/\//)[1] // https

以下是一些示例URL的可运行示例。

const urls = ['file://test.com', 'http://test.com', 'https://test.com', 'example.com?http'];

console.log(
  urls.map(url => (url.match(/^([a-z0-9]+):\/\//) || [])[1])
);


3
你可以使用在大多数浏览器中支持的URL API
function getProtocol(str) {
    try {
        var u = new URL(str);
        return u.protocol.slice(0, -1);
    } catch (e) {
        return '';
    }
}

用法

getProtocol('example.com?url=http://www.eg.com'); // returns ""
getProtocol('https://example.com?url=http://www.eg.com'); // returns "https"

那是真的,但如果我给你一个字符串:'http:/www.example.com',它也不应该返回“http”。 - user564927
@user564927 很有趣。单斜杠在Chrome、Firefox和Edge中似乎起着相同的作用。事实上,没有斜杠也可以 http:www.example.com - styfle
2
经过进一步调查,发现单斜杠是完全有效的,但在技术上与双斜杠有不同的含义。大多数浏览器将单斜杠视为用户错误并更正为双斜杠。 - styfle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接