2017-09-15 34 views
0

私のウェブサイトにサインアップページがあります。RegexはJavaScriptで動作しますが、PHPは動作しません

ユーザーがフォームに記入すると、JavaScript Regexを通じてリアルタイム検証が行われますが、これは正常に動作します。これを介して行われます:

var password = document.getElementsByName("password")[0].value; 
var pattern = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)([a-zA-Z0-9!\"\#$%&\'()*+,\-.\/:;<=>[email protected]\[\\\]^_`{|}~]{6,})$/; 
if(pattern.test(password)){ 
    document.getElementById("check_password").innerHTML = "Password is valid."; 
} else { 
    document.getElementById("check_password").innerHTML = "Password is invalid. It should have at least 6 characters, and 1 lowercase letter, uppercase letter, and number."; 
} 

ユーザーがこのを通じてフォームを送信する際にPHPの正規表現が使用されます。

if(!preg_match("/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)([a-zA-Z0-9!\"\#$%&\'()*+,\-.\/:;<=>[email protected]\[\\\]^_`{|}~]{6,})$/", $_POST["password"])){ 
     $error = "Password is invalid. It should have at least 6 characters, and 1 lowercase letter, uppercase letter, and number."; 
} 

しかし、PHPは、JavaScriptがない場合でも、エラーを投げ続けます。両方の正規表現は同じで、ここでPHP設定とJavaScript設定でテストされています。それはJavaScriptでは動作しますが、PHPでは動作しません!

なぜPHPでは動作しないのですか?どのように問題を解決できますか?

戻り値INT(0)が見つからない場合:するpreg_matchのリターンがあれば

+0

どのようなエラーが発生しますか。 phpは何の理由もなくエラーをスローしません。 – Andreas

+0

'$ _POST ['password']'にパスワードが含まれていることは間違いありませんか? – Jeff

+0

@Andreas PHPはエラーをスローしません、それは私のエラーメッセージです。基本的に、問題は正規表現が一致しないことです。 – ngmh

答えて

5

問題はバックスラッシュから発生します。

if(!preg_match("/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)([a-zA-Z0-9!\"\#$%&\'()*+,\-.\/:;<=>[email protected]\[\\\\\]^_`{|}~]{6,})$/", $_POST["password"])){ 
    $error = "Password is invalid. It should have at least 6 characters, and 1 lowercase letter, uppercase letter, and number."; 
} 

注それは:PHPの正規表現文字列リテラルのバックスラッシュを把握するには、(これも正規表現の特殊文字なので、あなたが正規表現のために一度、文字列のため、一度脱出する必要があります)4つのバックスラッシュを使用する必要がありますあなたはJavascriptの文字列でのRegExpコンストラクタを使用してパターンを定義することにした場合と同じである:余談として

var re = new RegExp("^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)([-a-zA-Z0-9!\"#$%&'()*+,./:;<=>[email protected]\\[\\]\\\\^_`{|}~]{6,})$"); 

、および問題を回避するために、文字クラス[a-zA-Z0-9!\"\#$%&\'()*+,\-.\/:;<=>[email protected]\[\\\\\]^_``{|}~][!-~]に短縮することができます。また、あなたがキャプチャグループは必要ありません。

if(!preg_match("/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[!-~]{6,}$/", $_POST["password"])){ 
    $error = "Password is invalid. It should have at least 6 characters, and 1 lowercase letter, uppercase letter, and number."; 
} 

が終了するのを、JavascriptとPHPの間のアンカー$の小さな違いがあります。 2つの言語では、文字列の終わりにマッチします(デフォルトでは複数行モードはありません)。PHPでは文字列の最後の改行文字の後に改行文字\nが続くと、行の終わりにも一致します。つまり、$のアンカーが0\nの間(\nの位置)に一致するため、文字列"Password0\n"がパターンにも一致します。

問題を回避するには、次の2つの可能性:

  • あなたはD modifier (PCRE_DOLLAR_ENDONLY)を使用することができます。
    /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[!-~]{6,}$/D
  • か(それは常にだけどんなモード文字列の末尾にマッチする)\z$を変更します。
    /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[!-~]{6,}\z/
+0

はい!これは正しいです。実際には、2つのバックスラッシュでなければなりません.4つは意味がありません。セット全体を含めると4つは無駄になります。本当にありがとう! – ngmh

+0

あなたは[[〜 - 〜]に短縮できる理由を説明できますか? – ngmh

+0

@ngmh:すべての文字を含む単純な文字範囲です(ascii表を参照)。 –

-1

あなたがチェックする必要があります。 INT(1)が見つかるとそれを返します。 エラーが発生した場合はBOOL(false)を返します。

+0

だから!pregmatch doesnt work? – ngmh

+0

そして私はpreg_mach()== 0を使わなければなりませんか? – ngmh

+0

正確には、falseを返すかどうかをチェックしています。これはエラーが発生したことを意味します。 – PocketKiller

関連する問題