javascript-在[[[http://“]]之前添加一个尚未包含“ http://”的URL

我有一个input字段,该字段保存一个URL,我希望此保存的输入可以识别变量的开头何时不存在“ Http //”,但不知道从何处开始...是否可以仅检查一个 字符串的一部分? -然后有一个必要时会附加的功能?

David asked 2020-08-11T10:57:19Z
12个解决方案
93 votes

如果您还想允许“ [https://”,]我将使用如下正则表达式:

if (!/^https?:\/\//i.test(url)) {
    url = 'http://' + url;
}

如果您不熟悉正则表达式,那么这就是每个部分的含义。

  • ^-仅在字符串开头匹配
  • \/\/-匹配文字字符串“ http”
  • \/\/-(可选)匹配“ s”
  • \/\/-匹配冒号
  • \/\/-转义“ /”字符,因为它们标记了正则表达式的开始/结尾
  • 正则表达式后的“ i”使其不区分大小写,因此将匹配“ [HTTP://”,]等。
Matthew Crumley answered 2020-08-11T10:59:00Z
67 votes

以下是您所需的简单解决方案:

var prefix = 'http://';
if (s.substr(0, prefix.length) !== prefix)
{
    s = prefix + s;
}

但是,您应该注意几件事...

这里的测试区分大小写。 这意味着如果字符串最初是if (new URI(s).scheme === null) { s = 'http://' + s; } ,则它将更改为http://,这可能不是您想要的。 您可能也不应修改任何以://开头的字符串,否则可能会得到类似http://https://example.com的结尾。

另一方面,如果您收到诸如if (new URI(s).scheme === null) { s = 'http://' + s; } 之类的输入,则您可能希望添加http://,因此仅搜索://对于一般解决方案可能不够好。

替代方法

  • 使用正则表达式:

    if (new URI(s).scheme === null)
    {
        s = 'http://' + s;
    }
    
  • 使用URI解析库(例如JS-URI)。

    if (new URI(s).scheme === null)
    {
        s = 'http://' + s;
    }
    

相关问题

  • JavaScript equalsIgnoreCase:不区分大小写的字符串比较
  • javascript startswith
  • 如何将URL解析为javascript中的主机名和路径?
Mark Byers answered 2020-08-11T10:58:10Z
23 votes

从Linkenizer提起(不介意为空)

link = (link.indexOf('://') === -1) ? 'http://' + link : link;

如果找不到://指示协议,它将在'http://'之前附加到link。 如果://出现在字符串的其他位置,则此方法将无法很好地工作,但这已经足够了。

例子:

http://www.google.com -> http://www.google.com
ftp://google.com      -> ftp://google.com
www.google.com        -> http://www.google.com
google.com            -> http://google.com

既然您说过要保存此URL,那么在服务器端执行此操作将是一个更好的主意,因此禁用了js的客户端不会弄乱链接。

quantumSoup answered 2020-08-11T10:59:34Z
5 votes

这是我用于即时满足的内容。 在jquery中利用keyup侦听器。

$('#url').keyup(function () {
        if (  ($(this).val().length >=5) && ($(this).val().substr(0, 5) != 'http:') && ($(this).val().substr(0, 5) != 'https') ) {
            $(this).val('http://' + $(this).val());
        }
    });
cjpetrus answered 2020-08-11T10:59:55Z
5 votes

我更改了@Mark Byers的答案,也包括了“ [https://”]。

function formatUrl(url){
    var httpString = 'http://'
        , httpsString = 'https://'
        ;

    if (url.substr(0, httpString.length) !== httpString && url.substr(0, httpsString.length) !== httpsString)
        url = httpString + url;

    return url;
}
Morgan Taylor answered 2020-08-11T11:00:16Z
5 votes

ES6,一根内胆

这是一种“现代”方法:

const withHttp = url => !/^https?:\/\//i.test(url) ? `http://${url}` : url;

您现在可以将withHttp用作功能:

const myUrl = withHttp("www.example.org");
rap-2-h answered 2020-08-11T11:00:46Z
3 votes

下面的代码段检查:

  • 检查网址是否为空
  • 删除开头或结尾的杂散空格
  • 检查[http://example.com,] [https://example.com]和//example.com

    if (!!url && !!url.trim()) { //Check if url is not blank
        url = url.trim(); //Removes blank spaces from start and end
        if (!/^(https?:)?\/\//i.test(url)) { //Checks for if url doesn't match either of: http://example.com, https://example.com AND //example.com
            url = 'http://' + url; //Prepend http:// to the URL
        }
    } else {
        //Handle empty url
    }
    
Akshay Goyal answered 2020-08-11T11:01:19Z
2 votes

像这样(通过内存写入)?

if (url.toUpper(url.substring(0, 7) != "HTTP://")
  url = "http://" + url;
Eugene Mayevski 'Allied Bits answered 2020-08-11T11:01:39Z
2 votes
if (url.indexOf('http://') != 0)
    url = 'http://' + url;
Casey Chu answered 2020-08-11T11:01:55Z
0 votes

我个人使用它,这部分取自php docs

$scheme = parse_url($link, PHP_URL_SCHEME);
if (empty($scheme)) {
    $link = 'http://' . ltrim($link, '/');
}
Satbir Kira answered 2020-08-11T11:02:15Z
0 votes

我将@Morgan Taylor和@Mark Byers的答案更改为不区分大小写。 与[http://]和[https://]一起使用

function formatUrl(url)
{
    var httpString = "http://";
    var httpsString = "https://";
    if (url.substr(0, httpString.length).toLowerCase() !== httpString && url.substr(0, httpsString.length).toLowerCase() !== httpsString)
                url = httpString + url;
    return url;
}
Edo Plantinga answered 2020-08-11T11:02:35Z
-1 votes

您可以使用System.String成员的“ StartsWith”。

if (url.ToUpper().StartsWith("HTTP://"))
{ 

}
Daniel James Bryars answered 2020-08-11T11:02:55Z
translate from https://stackoverflow.com:/questions/3543187/prepending-http-to-a-url-that-doesnt-already-contain-http