用于确保 HTTPS URL 架构的正则表达式

Regex to ensure HTTPS URL schema

我需要在 URL 中用 'https://' 替换 'http://'(如果前者存在);如果 'http://''https://' 不是前缀(架构),那么我需要在 URL 前加上 'https://'.

我可以简单地检查 URL 是否以 'http' 开头,并相应地将它作为前缀添加到 'https' 或替换 'http'(如果存在)。就这么简单,只需要 2 行代码,但是...

是否可以使用带有 JavaScript 正则表达式函数的一行来完成?

就这样

var str = "http://www.whatever.com.au";
str = str.replace("http://", "https://");
alert(str);

如果要单线的话:

url = url.replace("http://", "https://");
function simpleHttpsPrefixer(url) {
    return url.replace(/^(?:https?:\/\/)?(.*)/, "https://");
}

正则表达式解决方案

是的,可以使用 JS 正则表达式替换在一条语句中执行此操作:

url = url.replace(/^(?:https?:\/\/)?(.*)/, "https://");

下面的代码片段演示了上述单语句、正则表达式解决方案,其中包含 httphttps 和无架构 URL。

var schemalessUrl = "www.whatever.com.au";
var httpUrl = "http://www.whatever.com.au";
var httpsUrl = "https://www.whatever.com.au";

var urls = [schemalessUrl, httpUrl, httpsUrl];

for (var i = 0; i < urls.length; i++) {
    urls[i] = urls[i].replace(/^(?:https?:\/\/)?(.*)/, 'https://');
    console.log(urls[i]);
    alert(urls[i]);
}

非正则表达式解决方案

当然,也可以在没有正则表达式替换的情况下在单个语句中执行此操作。三元条件运算符几乎可以将任何内容折叠成一个语句(无论好坏):

url = url.indexOf('http://') === 0 ? url.replace('http://', 'https://') : (url.indexOf('https://') !== 0 ? 'https://' + url : url);

下面的代码片段类似地演示了上面的单语句、正则表达式解决方案以及 httphttps 和无模式 URL。

var schemalessUrl = "www.whatever.com.au";
var httpUrl = "http://www.whatever.com.au";
var httpsUrl = "https://www.whatever.com.au";

var urls = [schemalessUrl, httpUrl, httpsUrl];

for (var i = 0; i < urls.length; i++) {
    urls[i] = urls[i].indexOf('http://') === 0 ? urls[i].replace('http://', 'https://') : (urls[i].indexOf('https://') !== 0 ? 'https://' + urls[i] : urls[i]);
    console.log(urls[i]);
    alert(urls[i]);
}

话虽如此,我更喜欢正则表达式解决方案,但 TMTOWTDI。