我有一个输入文本框,它在keyup事件上运行js函数以匹配有效字符串(域名模式匹配,此处找到正则表达式)。
我写了if语句来测试输入是否是有效模式,然后是超过3个字符长。
显然,我的ifs不像我想要的那样工作。当输入有3个或更多字符时,就可以了。
但是如果输入少于3个字符,则表示模式正则表达式失败。
示例:如果输入框中有“dd”(没有引号),则该函数会在警告输入长度少于3个字符时警告我的模式不正确。
从包含的警告语句中,输入值中没有多余的空格或字符。
<input id="quick" type="text" size="20" onKeyUp="test()"></input>
功能测试是
function test(){
var liveword = document.getElementById("quick").value;
var valid = /^[a-zA-Z0-9][a-zA-Z0-9\-\_]+[a-zA-Z0-9]$/;
alert("xxx"+liveword+"xxx");
if (liveword.match(valid))
{
if (liveword.length < 3)
{
alert ('word less than 3');
}
else {
alert ('word more than 3');
}
}//outside if
else {
alert('enter correct pattern');
}
} //close
答案 0 :(得分:2)
由于您的模式目前正在编写,因此3个字母以下的任何内容都无法匹配。你的正则表达式是“找到任何字母数字,然后是至少一个字母数字或短划线或下划线,然后是最后的字母数字。”
我认为你可能实际上想要一些可选的匹配。用:
var valid = /^[a-zA-Z0-9][a-zA-Z0-9\-\_]*[a-zA-Z0-9]?$/;
即使只有一个字符,您也会匹配任何字母数字。实际上,上述内容与简单地说:
var valid = /^[a-zA-Z0-9][a-zA-Z0-9\-\_]*$/;
请注意,两者仍可能匹配a-
之类的内容。如果这不是预期的匹配(即,当使用连字符或破折号时你想要一个终止的字母数字),那么请使用:
var valid = /^[a-zA-Z0-9]([a-zA-Z0-9\-\_]*[a-zA-Z0-9])?$/;
其中说“查找一个字母数字。如果它后面有字符,则可以后跟零个或多个字母数字或连字符或下划线字符,只要最后一个字符是字母数字。”
答案 1 :(得分:1)
你的第一个if是测试模式是否匹配,无论长度如何。如果它是一个很好的匹配,那么你检查长度。如果没有,则提示“输入正确的模式”。
你想这样做:
if( liveword.length < 3 )
alert( 'too short' )
else
{
// check patterns, alert good or bad
}
修改
您的代码,重构:
function test(){
var liveword = document.getElementById("quick").value;
var valid = /^[a-zA-Z0-9][a-zA-Z0-9\-\_]+[a-zA-Z0-9]$/;
alert("xxx"+liveword+"xxx");
if( liveword.length < 3 )
alert( 'word less than 3' );
else
{
if( liveword.match(valid) )
alert( 'good match')
else
alert( 'bad match' )
}
} //close
答案 2 :(得分:0)
如果if (liveword.match(valid))
成功,那么这意味着该字长度至少为三个字符,因为正则表达式至少需要三个字符。因此,if (liveword.length < 3)
检查将永远不会成功。您需要将其移动到else
子句,以便在不匹配
if (liveword.match(valid)) {
alert ('word 3 or more');
}
else if (liveword.length < 3) {
alert ('word less than 3');
}
else {
alert('enter correct pattern');
}