最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

html - How to validate a user's birth date in JavaScript with a Regular Expression? - Stack Overflow

programmeradmin1浏览0评论

How to validate a user's birth date with a Regular Expression in JavaScript? Is test a preferred method for validating user input with a Regular Expression?

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>

How to validate a user's birth date with a Regular Expression in JavaScript? Is test a preferred method for validating user input with a Regular Expression?

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>

Share Improve this question edited Jun 4, 2019 at 19:23 username653ue6 asked Apr 25, 2019 at 14:02 username653ue6username653ue6 312 silver badges10 bronze badges 8
  • 1 You initialize regexVarTest then you refer to regularExpressionTest ... – Pointy Commented Apr 25, 2019 at 14:06
  • That and birthday isn't defined anywhere – George Commented Apr 25, 2019 at 14:07
  • That date format is ambiguous. JavaScript engines interpret that format as mm/dd/yyyy. Better use a more reliable method to parse the date – trincot Commented Apr 25, 2019 at 14:14
  • BTW, the snippet is still producing "birthday is not defined" – trincot Commented Apr 25, 2019 at 14:16
  • Just use a date input... developer.mozilla/en-US/docs/Web/HTML/Element/input/date – Brad Commented Apr 25, 2019 at 14:29
 |  Show 3 more ments

3 Answers 3

Reset to default 3

There are several issues:

  • You pass a Date to the regex test method, but you should really pass the input string.
  • Several variables are not defined, including result, birthday, todayYear.
  • The cutoff points seem to be defined as numbers (number of years), but in the if conditions they are treated as dates. This cannot work. You should really subtract a number of years from the current date (resulting in a date). Just paring calendar years is not a right method to determine someone's age. At the time of writing, someone born in January 2000 is older than 19, while someone born in December 2000 is younger than 19.
  • An error message saying that the date is not a number is misleading to the user who had entered "13/13/1990". It should just say the date is invalid.
  • The regex should require that the input does not contain other things than just the date -- it should use ^ and $ anchors
  • The dd/mm/yyyy format is ambiguous. When passed to new Date, it will be interpreted as mm/dd/yyyy. Better first convert it to some standard format like YYYY-MM-DD. The code below does this conversion of the dd/mm/yyyy input to the YYYY-MM-DD format, before passing it to the Date constructor.

Also, since there is nothing dynamic in your regex, you can just use a regex literal, instead of calling the RegExp constructor.

Here is the corrected code:

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>

As to the meaning of "older than 19": if this means that a person should be 20 years or older (and not just 19 plus one day), than don't subtract 19, but subtract 20.

There are some issues in your code as explained in the ments for missing initialization of some variables.

However the issue with regex is, when you do

new Date("07/03/2010");

it results to

Sat Jul 03 2010 00:00:00 GMT+0530 

This is why your regex which should pass a value such as 07/03/2010 is not passing the change value. You need to run the regex on the direct value of

document.getElementById("dob").value

So it should be something like

var userBirthDate = document.getElementById("dob").value;
var regexVar = new RegExp("([0-9]{2})\/([0-9]{2})\/([0-9]{4})");
var regexVarTest = regexVar.test(userBirthDate);

function myValidator() {
  var userBirthDate = document.getElementById("dob").value;
  var regexVar = new RegExp("([0-9]{2})\/([0-9]{2})\/([0-9]{4})");
  var regexVarTest = regexVar.test(userBirthDate);
  
  alert(regexVarTest);
}
<p>
  <label for="dob">Date of Birth</label>
  <input type="text" name="dob" id="dob" maxlength="10" required 
         placeholder="dd/mm/yyyy" 
         pattern="([0-9]{2})\/([0-9]{2})\/([0-9]{4})"/>
  <span id="dobErrMsg"></span>
</p>
<button onclick="myValidator()">Run validation</button>

function myValidator() {
      var result = true;
      var birthday = document.getElementById("dob").value
      var regexVar = new RegExp("(([012]{1})?[0-9]{1}|[3]?[01]{1})\/(([0]{1})?[0-9]{1}|[1]{1}?[012]{1})\/([12]{1}[09]{1}[0-9]{2})");
      var regexVarTest = regexVar.test(birthday);
      //if format is valid
      if (regexVarTest){
        var date_array = birthday.split('/')
        var userBirthDate = new Date(date_array[2], parseInt(date_array[1])-1, date_array[0]);
        var userage = userBirthDate.getFullYear();
        var todayYear = new Date().getFullYear()
        var cutOff19 = todayYear - 19;
        var cutOff95 = todayYear - 95;
      }
      
      dobErrMsg.innerHTML = "";
      
      if (regexVarTest == false) {
        dobErrMsg.innerHTML = "enter date of birth as dd/mm/yyyy";
        result = false;
      } else if (isNaN(Date.parse(date_array[2]+'-'+date_array[1]+'-'+date_array[0])) || new Date(date_array[2]+'-'+date_array[1]+'-'+date_array[0]).getDate() != parseInt(date_array[0])){
        dobErrMsg.innerHTML = "enter valid date";
        result = false;
      } else if (userage >= cutOff19) {
        dobErrMsg.innerHTML = "you have to be older than 19";
        result = false;
      } else if (userage <= cutOff95) {
        dobErrMsg.innerHTML = "you have to be younger than 95";
        result = false;
      }
    
      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>

I think you are looking for this. Let me know if that solve your problem.

Update: I have update date validation which was missing till now.

发布评论

评论列表(0)

  1. 暂无评论