39

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?

thefourtheye
  • 233,700
  • 52
  • 457
  • 497
elgis
  • 478
  • 1
  • 5
  • 9

4 Answers4

73

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}$");
thefourtheye
  • 233,700
  • 52
  • 457
  • 497
  • RegEx literal (double quotes around that should not be there), that's something new for me. Thanks. – electroid Apr 21 '16 at 05:01
  • 1
    In my case I changed `value.test(/*/)` to `value.match(/*/)` and it worked, here's the [difference](https://stackoverflow.com/questions/10940137/regex-test-v-s-string-match-to-know-if-a-string-matches-a-regular-expression) –  Sep 25 '20 at 03:16
18

Your pattern holds a string, and not a regular expression.

Make it var pattern = /^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/; (without quotes)

Gaurang Tandon
  • 6,504
  • 11
  • 47
  • 84
4

Encountered a similar issue.

Solution: use .match() instead of .test() method

Waleed93
  • 1,130
  • 2
  • 15
  • 24
4

Also, make sure to write /pattern/.test("string") as opposed to "string".test(/pattern/).