Reputation: 498
I'm writing a register form which has a ton of javascript included. While writing the basic functions to check the format of certain strings, I came across this problem (I've tried to solve it by myself but no luck there). In this simplified version I have three functions: one to check the format of phone number, second to check the format of email and third to combine those two functions to make it more clear. Here's the code:
<html>
<head>
<meta charset="utf-8">
<script>
function filterPhone(phone){
var pattern = "/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/";
return pattern.test(phone);
}
function filterEmail(email) {
var regex = /^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/;
return regex.test(email);
}
function checkForm(){
var puh = document.getElementById("puh").value;
var email = document.getElementById("email").value;
if(filterPhone(puh) && filterEmail(email)){
alert("It works");
return true;
} else {
alert("Check the format!");
return false;
}
}
</script>
</head>
<body>
<form method="post" action="" name="regForm" onsubmit="return checkForm()">
<input type="text" name="puh" id="puh" placeholder="Phonenumber"><br>
<input type="text" name="email" id="email" placeholder="Email address"><br>
<input type="submit" value="Check!">
</form>
</body>
</html>
If I only use the function filterEmail it works fine but when I use them both (or even only the filterPhone!) it gives me an error: "TypeError: pattern.test is not a function" ("pattern" referring to the first function's (filterPhone) variable name called pattern). I've tried using exec() instead of test() and changing the regex-pattern, neither have worked. This is rather weird since the syntax seems to be correct. Why could be the reason?
Upvotes: 42
Views: 79742
Reputation: 197
Also, make sure to write /pattern/.test("string")
as opposed to "string".test(/pattern/)
.
Upvotes: 4
Reputation: 1300
Encountered a similar issue.
Solution: use .match()
instead of .test()
method
Upvotes: 6
Reputation: 6753
Your pattern holds a string, and not a regular expression.
Make it var pattern = /^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/;
(without quotes)
Upvotes: 18
Reputation: 239513
Your pattern
must be RegEx literal (double quotes around that should not be there) like this
var pattern = /^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/;
Otherwise you need to use RegExp
object, with proper escaping for \
, like this
var pattern = new RegExp("^(()?\\d{3}())?(-|\\s)?\\d{3}(-|\\s)?\\d{4}$");
Upvotes: 81