我有一个个人功能,他会使用id和模式来检查输入。
var id, schema;
function checkField(id, schema){
var input = id.val();
var pattern = schema;
if (!input.match(pattern)){
console.log('Input = '+input);
console.log('Pattern = '+pattern);
id.removeClass().addClass("error");
$(".oke").css({display: 'none'});
}else{
console.log('Classe = ok');
id.removeClass().addClass("ok");
$(".nope").css({display: 'none'});
}
}
// Vérification téléphone
$("#tel").focusout(function(){
checkField($(this), "/0[1-7,9]\d{8}/");
});
// Vérification code postale
$("#cp").focusout(function(){
checkField($(this), "/^((0[1-9])|([1-8][0-9])|(9[0-8])|(2A)|(2B))[0-9]{3}$/");
});
但if条件总是返回null
(!input.match(pattern)
)。
两个控制台日志返回输入中的数字写入,并且模式正确,为什么if始终为false?
答案 0 :(得分:2)
当您将"/0[1-7,9]\d{8}/"
传递给String#match()
时,\
之前的d
被删除,因为它是一个未知的转义序列,而/
位于/
附近模式在模式中被视为文字,
符号。因此,你没有匹配。此外,字符类中的^
也被视为文字逗号,我相信您要将其从模式中删除。此外,如果您计划匹配整个字符串,则第一个模式在开始时缺少$
,在结尾缺少"^0[1-79]\\d{8}$"
锚点。通过/^0[1-7,9]\d{8}$/
或 - 首选 - 使用正则表达式文字/^(0[1-9]|[1-8]\d|9[0-8]|2[AB])\d{3}$/
(模式周围没有双引号)。
第二种模式可以缩短为if (!input.match(pattern))
- 再次注意,正则表达式文字符号周围没有双引号。
此外,建议将if (!pattern.test(input))
替换为regex.test(str)
,因为str.match(regex)
返回 true 或 false {{1}将返回 null 或匹配数据的数组。
那么,您可以使用的是
if (!pattern.test(input)){
...
$("#tel").focusout(function(){
checkField($(this), /^0[1-79]\d{8}$/);
});
$("#cp").focusout(function(){
checkField($(this), /^(0[1-9]|[1-8]\d|9[0-8]|2[AB])\d{3}$/);
})
答案 1 :(得分:1)
JavaScript正则表达式模式不是字符串,您应该删除双引号。
$("#tel").focusout(function(){
checkField($(this), /0[1-7,9]\d{8}/);
});
$("#cp").focusout(function(){
checkField($(this), /^((0[1-9])|([1-8][0-9])|(9[0-8])|(2A)|(2B))[0-9]{3}$/);
})