web-dev-qa-db-ja.com

TypeError:pattern.testは関数ではありません

私は大量のjavascriptが含まれている登録フォームを書いています。特定の文字列の形式を確認するための基本的な関数を作成しているときに、この問題に出会いました(自分で解決しようとしましたが、運はありませんでした)。この簡易版には、3つの機能があります。1つは電話番号の形式を確認し、2つ目は電子メールの形式を確認し、3つ目はこれら2つの機能を組み合わせてより明確にします。コードは次のとおりです。

<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>

関数filterEmailのみを使用すると正常に機能しますが、両方を使用すると(またはfilterPhoneのみ!)エラーが発生します。"TypeError:pattern.testは関数ではありません"( "パターン」と呼ばれる最初の関数(filterPhone)変数名を参照)。 test()の代わりにexec()を使用して正規表現パターンを変更しようとしましたが、どちらも機能しませんでした。構文が正しいように見えるので、これはかなり奇妙です。なぜ理由なのでしょうか?

22
elgis

patternは、次のようなRegExリテラル(二重引用符で囲む必要があります)でなければなりません

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

それ以外の場合は、 RegExp オブジェクトを使用する必要があります。このように、\を適切にエスケープします

var pattern = new RegExp("^(()?\\d{3}())?(-|\\s)?\\d{3}(-|\\s)?\\d{4}$");
42
thefourtheye

パターンにはstringが含まれ、正規表現は含まれません。

var pattern = /^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/;にする(引用符なし)

13
Gaurang Tandon