2010-08-22 59 views
26

我有一个input字段可以保存一个URL,我希望这个保存的输入可以在“Http //”是从变量的开始缺席,但不知道从哪里开始......是否有可能只检查一部分字符串? - 然后有必要的话可以附加一个函数?预先将“http://”添加到一个不包含“http://”的URL中

+3

https也是一个考虑因素吗? – 2010-08-22 20:44:40

回答

55

你想要的东西一个简单的解决方案是:

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

但也有一些事情你应该知道的...

这里的测试是区分大小写。这意味着如果字符串最初是Http://example.com,则会将其更改为http://Http://example.com,这可能不是您想要的。你可能也不应该修改任何以foo://开头的字符串,否则你可能会得到类似http://https://example.com的东西。

在另一方面,如果你收到的输入,如example.com?redirect=http://othersite.com那么你可能要在前面加上http://所以只是在寻找://一个通用的解决方案可能还不够好。

替代方法

  • 使用正则表达式:

    if (!s.match(/^[a-zA-Z]+:\/\//)) 
    { 
        s = 'http://' + s; 
    } 
    
  • 使用URI解析库如JS-URI

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

相关问题

+1

这是推荐的。 – Marwelln 2010-08-22 20:28:20

+0

好的解决方案。继续保持 – 2015-01-22 06:38:29

+1

注意协议相对URL(以URL开始的url),这可能会有意想不到的结果。例如:'// example.com/foo',上面的代码会将其改为'http:////示例。com/foo' – 2015-06-24 20:05:16

2

这样的事情(通过记忆写)?

if (url.toUpper(url.substring(0, 7) != "HTTP://") 
    url = "http://" + url; 
+5

'url.substring(0,7).toUpperCase()' – 2010-08-22 20:43:53

-1

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

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

} 
+0

这不是C#。 – quantumSoup 2010-08-22 20:27:43

+4

if(isNotC#){return“StartWith does not exist。”; } – Hello71 2010-08-22 20:28:08

+0

JavaScript的美妙之处在于,这可以完成。 – 2010-08-22 20:32:33

12

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禁用不会乱谁的客户链接。

+0

请记住,这'mailto:'链接将失败。 – 2010-08-22 20:46:06

76

如果您还想允许“https://开头”,我会使用一个正则表达式是这样的:

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

如果你不熟悉正则表达式,这里是各个部分。

  • ^ - 只匹配在字符串
  • http的开始 - 匹配文本字符串 “HTTP”
  • s? - 可选匹配一个 “s”
  • : - 匹配一个冒号
  • \/\/ - 由于它们标记正则表达式的开始/结尾,因此可以跳过“/”字符
  • 正则表达式之后的“i”使它不区分大小写的,因此将匹配“HTTP://”等
+0

没有帮助,如果URL已经'Http:'或'HTTP:'。 – 2014-10-30 03:23:47

+0

你应该知道'''!/^https?:\/\ // i.test(undefined)'''是'''true'''。 我建议检查'''url'''是否没有错: '''if(!! url &&!/^https?:\/\ // i.test(url)){...' '' – 2017-05-12 07:14:07

+2

使用'''!/ ^(https?:)?\/\ // i.test(url)'''来处理//:example.com。 – 2017-06-12 09:47:33

2
if (url.indexOf('http://') != 0) 
    url = 'http://' + url; 
0

我个人使用,这部分从PHP文档采取

​​
4

下面是我使用的及时行乐。利用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()); 
     } 
    }); 
+1

谢谢,使用了这个,只是将JQuery选择器更改为'''$('input [type = url]')''' – dirk 2016-01-29 13:14:46

3

我改变@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; 
} 
0

我改变@Morgan Taylor和@Mark Byer的答案是不区分大小写的。作品以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; 
} 
1

下面的代码片段检查:

  • 检查,如果网址不为空
  • 在启动流浪删除空格或结束
  • 检查http://example.com,https://example.com AND //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 
    } 
    
相关问题