我想检测在文本输入中输入的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://
会附加到你好,即使它不是网址。任何帮助将不胜感激。
答案 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可能非常棘手。这些只是您的解析器可能失败的几种情况:
госуслуги.рф
)xn--blah
).amazon
)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个字符的扩展名字符。
基本验证似乎没问题吗?如果您发现可能出现的任何问题,请告诉我。
我知道它会检测电子邮件地址,但在这种情况下这不重要。