如何使用 JavaScript 中的正则表达式验证用户的出生日期? test
是使用正则表达式验证用户输入的首选方法吗?
function myValidator() {
result = true;
var today = new Date();
var todayYear = today.getFullYear();
var userBirthDate = new Date(document.getElementById("dob").value);
var regexVar = new RegExp("([0-9]{2})\/([0-9]{2})\/([0-9]{4})");
var regexVarTest = regexVar.test(userBirthDate);
var cutOff19 = todayYear - 19;
var cutOff95 = todayYear - 95;
if (isNaN(userBirthDate)) {
dobErrMsg.innerHTML = "date of birth must be a number";
} else if (regexVarTest == false) {
dobErrMsg.innerHTML = "enter date of birth as dd/mm/yyyy";
} else if (userBirthDate >= cutOff19) {
dobErrMsg.innerHTML = "you have to be older than 19";
} else if (userBirthDate <= cutOff95) {
dobErrMsg.innerHTML = "you have to be younger than 95";
}
return result;
}
<p>
<label for="dob">Date of Birth</label>
<input type="text" name="dob" id="dob" maxlength="10" placeholder="dd/mm/yyyy" pattern="([0-9]{2})\/([0-9]{2})\/([0-9]{4})" required="required" />
<span id="dobErrMsg"></span>
</p>
<button onclick="myValidator()">Run validation</button>
最佳答案
有几个问题:
- 您将日期传递给正则表达式
test
方法,但实际上应该传递输入字符串。 - 有几个变量未定义,包括
result
、birthday
、todayYear
。 - 截止点似乎被定义为数字(年数),但在
if
条件中它们被视为日期。这是行不通的。您实际上应该从当前日期中减去几年(得到一个日期)。仅比较历年并不是确定某人年龄的正确方法。在撰写本文时,2000 年 1 月出生的人年龄超过 19 岁,而 2000 年 12 月出生的人年龄不到 19 岁。 - 指出日期不是数字的错误消息会误导输入“13/13/1990”的用户。它应该只是说日期无效。
- 正则表达式应要求输入除日期外不包含其他内容 - 它应使用
^
和$
anchor - dd/mm/yyyy 格式不明确。当传递给
new Date
时,它将被解释为 mm/dd/yyyy。最好先将其转换为某种标准格式,例如 YYYY-MM-DD。下面的代码将 dd/mm/yyyy 输入转换为 YYYY-MM-DD 格式,然后将其传递给Date
构造函数。
此外,由于您的正则表达式中没有任何动态内容,因此您可以只使用正则表达式文字,而不是调用 RegExp
构造函数。
这是更正后的代码:
function myValidator() {
var birthday = document.getElementById("dob").value; // Don't get Date yet...
var regexVar = /^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$/; // add anchors; use literal
var regexVarTest = regexVar.test(birthday); // pass the string, not the Date
var userBirthDate = new Date(birthday.replace(regexVar, "$3-$2-$1")); // Use YYYY-MM-DD format
var todayYear = (new Date()).getFullYear(); // Always use FullYear!!
var cutOff19 = new Date(); // should be a Date
cutOff19.setFullYear(todayYear - 19); // ...
var cutOff95 = new Date();
cutOff95.setFullYear(todayYear - 95);
if (!regexVarTest) { // Test this before the other tests
dobErrMsg.innerHTML = "enter date of birth as dd/mm/yyyy";
} else if (isNaN(userBirthDate)) {
dobErrMsg.innerHTML = "date of birth is invalid";
} else if (userBirthDate > cutOff19) {
dobErrMsg.innerHTML = "you have to be older than 19";
} else if (userBirthDate < cutOff95) {
dobErrMsg.innerHTML = "you have to be younger than 95";
} else {
dobErrMsg.innerHTML = "";
}
return userBirthDate; // Return the date instead of an undefined variable
}
<p>
<label for="dob">Date of Birth</label>
<input type="text" name="dob" id="dob" maxlength="10" placeholder="dd/mm/yyyy" pattern="([0-9]{2})\/([0-9]{2})\/([0-9]{4})" required="required" />
<span id="dobErrMsg"></span>
</p>
<button onclick="myValidator()">Run validation</button>
关于“19岁以上”的含义:如果这意味着一个人应该年满20岁(而不仅仅是19岁加一天),那么不要减去19,而是减去20。
关于javascript - 如何使用正则表达式在 JavaScript 中验证用户的出生日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55851164/