我在发帖之前搜索了SO,但找不到对我有用的答案。
下面是一个用于测试用户名的简单JS脚本。
用户名长度验证工作正常但字符验证不会:
所有不允许的字符(例如$%; [+))都会通过,但它们应该返回错误。
<script type="text/javascript">
$(document).ready(function() {
$("#username").change(function() {
var username = $("#username").val();
var msgbox = $("#status");
var usernameRegex = /^[a-zA-Z0-9][a-zA-Z0-9\._-]$i/
if ((username.length >= 4 && username.length <= 20) &&
(usernameRegex.test(username.value) == false)) {
$.ajax({
type: "POST",
url: "username.php",
data: "username=" + username,
success: function(msg) {
if (msg == 'OK') {
msgbox.html('<img src="ok.png">');
} else {
msgbox.html(msg);
}
}
});
} else {
$("#status").html('<img src="no.png">Try again');
}
});
});
</script>
我错过了什么?
答案 0 :(得分:1)
您正在向后检查测试结果。如果模式匹配,test()
方法将返回true
。而且你正在检查虚假价值。
将其更改为:
if ((username.length >= 4 && username.length <= 20)
&& usernameRegex.test(username.value)) {
答案 1 :(得分:1)
/^[a-zA-Z0-9][a-zA-Z0-9\._-]{4,20}$i/
^^
Here is the problem
您可能想要指定不区分大小写的标志,但不小心将i
放在正则表达式模式本身中,您需要将表达式修改为:
/^[a-zA-Z0-9][a-zA-Z0-9\._-]{4,20}$/i
并且他们已经指出你应该测试一个true
条件,换句话说,你需要检查字符串是否与模式匹配,因此只包含你允许的字符。
答案 2 :(得分:1)
您的正则表达式存在问题,而且不仅仅是$i/
。你有:
var usernameRegex = /^[a-zA-Z0-9][a-zA-Z0-9\._-]$i/;
第二个令牌[a-zA-Z0-9\._-]
仅评估一次。它检查第一个标记的第一个字符,然后检查第二个标记的第二个字符,然后因$
而期望字符串结束。即使将测试条件更改为true
并修复其余逻辑,原始正则表达式也会失败超过两个字符的所有用户名。
请改为尝试:
var usernameRegex = /^[a-zA-Z0-9][a-zA-Z0-9\._-]+$/i;
+
确保正则表达式会在令牌中查找至少一个字符,并匹配它们直到字符串结束。
最后,正如其他人所提到的,您需要usernameRegex.test(username)
而不是usernameRegex.test(username.value)
,并且需要测试true
值,而不是false
。