2014-05-04 11 views
12

Ich schreibe ein Registerformular, das eine Tonne Javascript enthalten hat. Während ich die grundlegenden Funktionen schrieb, um das Format bestimmter Strings zu überprüfen, stieß ich auf dieses Problem (ich habe versucht, es selbst zu lösen, aber kein Glück dort). In dieser vereinfachten Version habe ich drei Funktionen: eine, um das Format der Telefonnummer zu überprüfen, zweitens, um das Format der E-Mail zu überprüfen, und drittens, um diese beiden Funktionen zu kombinieren, um es klarer zu machen. Hier ist der Code:TypeError: pattern.test ist keine Funktion

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

Wenn ich nur die Funktion verwenden filterEmail es gut funktioniert, aber wenn ich sie verwenden beide (oder auch nur die filterPhone!) Es gibt mir eine Fehlermeldung: „Typeerror: pattern.test ist nicht eine Funktion " (" pattern "bezieht sich auf den Variablennamen der ersten Funktion (filterPhone) namens pattern). Ich habe versucht, exec() anstelle von test() zu verwenden und das Regex-Muster zu ändern, beides hat nicht funktioniert. Das ist ziemlich seltsam, da die Syntax korrekt zu sein scheint. Warum könnte der Grund sein?

Antwort

25

Ihre pattern müssen RegEx wörtliche (doppelte Anführungszeichen, die nicht da sein sollte) wie dieses

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

Andernfalls müssen Sie RegExp Objekt verwenden, mit der richtigen für \ zu entkommen, wie diese

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

RegEx wörtliche (doppelte Anführungszeichen um das sollte nicht da sein), das ist etwas Neues für mich. Vielen Dank. – electroid

8

Ihr Muster enthält eine Zeichenfolge und kein regulärer Ausdruck.

Machen Sie es var pattern = /^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/; (ohne Anführungszeichen)