javascript - 如何使用正则表达式在 JavaScript 中验证用户的出生日期?

标签 javascript html

如何使用 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 方法,但实际上应该传递输入字符串。
  • 有几个变量未定义,包括 resultbirthdaytodayYear
  • 截止点似乎被定义为数字(年数),但在 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/

相关文章:

javascript - 如何映射 `.find()`返回的数据?

javascript - jasmine running 和 waitsFor 实际上做了什么?

html - SVG 图像在浏览器中的显示方式不同

javascript - 在更改时在两个下拉菜单之间传递值。无需点击即可更新

javascript - 如何使用 AngularJS 从 JSON 对象中删除 null?

javascript - Google map 标记点击事件冒泡

javascript - PHP数据动态到Html表

Javascript二维数组在打印其他数组之前给出未定义的

php - 如何实现桌面股票行情?

html - 应用 onmouseover 更改文本