正则表达式检测网址并预置http://

时间:2013-10-21 10:05:11

标签: javascript regex

我想检测在文本输入中输入的url。我有以下代码,它将http://添加到输入内容的开头:

var input = $(this);
var val = input.val();
if (val && !val.match(/^http([s]?):\/\/.*/)) {
    input.val('http://' + val);
}

如果它包含一个后跟tld的字符串,我将如何调整它以仅附加http://?如果我输入一个字符串,例如:

Hello. This is a test

http://会附加到你好,即使它不是网址。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:0)

这个简单的功能对我有用。我们并不关心TLD域的真实存在以获得速度,而是检查example.com之类的语法。

抱歉,我忘记了VBA trim ()不是js中的内在函数,所以:

// Removes leading whitespaces
function LTrim(value)
{
    var re = /\s*((\S+\s*)*)/;
    return value.replace(re, "$1");
}

// Removes ending whitespaces
function RTrim(value)
{
    var re = /((\s*\S+)*)\s*/;
    return value.replace(re, "$1");
}

// Removes leading and ending whitespaces
function trim(value)
{
    return LTrim(RTrim(value));
}

function hasDomainTld(strAddress)
{ 
  var strUrlNow = trim(strAddress);
  if(strUrlNow.match(/[,\s]/))
  {
    return false;
  }
  var i, regex = new RegExp(); 
  regex.compile("[A-Za-z0-9\-_]+\\.[A-Za-z0-9\-_]+$"); 
  i = regex.test(strUrlNow);
  regex = null;
  return i;
} 

所以你的代码,$(this)是window对象,所以我通过参数传递objInput,使用经典的js而不是jQuery:

function checkIt(objInput)
{
  var val = objInput.value;
  if(val.match(/http:/i)) {
    return false;
  }
  else if (hasDomainTld(val)) {
    objInput.value = 'http://' + val;
  }
}

请自己测试一下:http://jsfiddle.net/SDUkZ/8/

答案 1 :(得分:0)

您需要首先缩小您的要求,因为使用正则表达式检测URL可能非常棘手。这些只是您的解析器可能失败的几种情况:

  • IDN(госуслуги.рф
  • Punycode案例(xn--blah
  • 正在注册新的顶级域名(.amazon
  • SEO友好的网址(domain.com/Everything you need to know about RegEx.aspx

我们最近遇到了类似的问题,我们最终做的是简单检查网址是以http://https://还是ftp://开头,还是以{{1}为前缀如果它不是从任何提到的方案开始。这是TypeScript中的实现:

http://

正如您所看到的,我们并不想在这里变得聪明,因为我们无法预测每种可能的URL形式。此外,此方法通常针对我们知道为URL的字段值执行,因此误检的变化很小。

希望这有帮助。

答案 2 :(得分:0)

我找到的最佳解决方案是使用以下正则表达式:

/\.[a-zA-Z]{2,3}/

这会检测到网址后的.,以及限制为2/3个字符的扩展名字符。

基本验证似乎没问题吗?如果您发现可能出现的任何问题,请告诉我。

我知道它会检测电子邮件地址,但在这种情况下这不重要。