0

我想检测在文本输入中输入的 url。我有以下代码,该代码http://位于已输入内容的开头:

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

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

Hello. This is a test

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

4

3 回答 3

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) 是窗口对象,所以我通过一个参数传递 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/

于 2013-10-21T10:15:24.960 回答
0

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

  • 国际化域名 ( госуслуги.рф)
  • Punycode 案例 ( xn--blah)
  • 正在注册的新 TLD ( .amazon)
  • 对 SEO 友好的 URL ( domain.com/Everything you need to know about RegEx.aspx)

我们最近遇到了一个类似的问题,我们最终做的是一个简单的检查 URL 是否以 , 或 开头http://https://如果它不以任何提到的方案开头,则在ftp://前面加上。http://这是 TypeScript 中的实现:

public static EnsureAbsoluteUri(uri: string): string {
  var ret = uri || '', m = null, i = -1;
  var validSchemes = ko.utils.arrayMap(['http', 'https', 'ftp'], (i) => { return i + '://' });

  if (ret && ret.length) {
    m = ret.match(/[a-z]+:\/\//gi);

    /* Checking against a list of valid schemes and prepending with "http://" if check fails. */
    if (m == null || !m.length || (i = $.inArray(m[0].toLowerCase(), validSchemes)) < 0 ||
      (i >= 0 && ret.toLowerCase().indexOf(validSchemes[i]) != 0)) {

      ret = 'http://' + ret;
    }
  }

  return ret;
}

正如你所看到的,我们并没有试图变得聪明,因为我们无法预测每一种可能的 URL 形式。此外,此方法通常针对我们知道的 URL 字段值执行,因此错误检测的变化很小。

希望这可以帮助。

于 2013-10-21T10:28:54.707 回答
0

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

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

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

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

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

于 2013-10-21T11:52:20.680 回答