2016-06-23 10 views
0

人が間違った郵便番号形式を入力した場合や入力欄を残した場合、エラーが発生するようにしています。私はなぜそれが動作していないか把握しようとしています。助けてください!PHPが検証されないのはなぜですか?

<td>Postal Code</td> 
<td> 
    <input type="text" id="postal_code" name="postal_code" value="<?php if($_POST['postal_code'] == null){ echo '';}else{echo $_POST['postal_code'];}?>"/> 
</td> 
<td class="error" colspan="2"> 
    <?php 
     if(isset($_POST['send_bulkform']) && $_POST['postalcode'] != preg_match("[A\-Za\-z][0\-9][A\-Za\-z] [0\-9][A\-Za\-z][0\-9]",$_POST['postal_code']) || isset($_POST['send_studentform']) && $_POST['postalcode'] != preg_match("[A\-Za\-z][0\-9][A\-Za\-z] [0\-9][A\-Za\-z][0\-9]",$_POST['postal_code'])) 
     { 
      echo "Required, ex. A1A 1A1."; 
     } 
     elseif(isset($_POST['send_bulkform']) && $_POST['postalcode'] == null || isset($_POST['send_studentform']) && $_POST['postalcode'] == null) 
     { 
      echo "Required, ex. A1A 1A1."; 
     } 
    ?> 
</td> 
</tr> 
+1

まず、 'preg_match()'とその同僚は[デリミタ](http://php.net/manual/en/regexp.reference.delimiters.php)を必要とします。第二に、文字グループのダッシュをエスケープする必要はありません。 '[A \ -Z]'の代わりに '[A-Z]'を書いてください。 –

+1

ところで:[世界中で使用するフォーマットが多すぎる](https://en.wikipedia.org/wiki/List_of_postal_codes)のように、郵便番号の有効性を確認することはおそらくお勧めできません。いくつかの国はいくつかのフォーマットを使用しています。 – feeela

+1

これは正規表現とは何でしょうか? 'A'、' -'、 'Z'、' a'、 '-'、' z'を許します。次に、 '0'、' -'、または '9'のいずれかです。等 – chris85

答えて

1

あなたの正規表現が間違っている、とあなたのPHPの使い方が間違っています:

preg_match("[A\-Za\-z][0\-9][A\-Za\-z] [0\-9][A\-Za\-z][0\-9]",$_POST['postal_code']) 

で:交換してください。 PHP正規表現ではdelimitersが必要です。

PCRE正規表現のバックスラッシュは、次の文字をエスケープします。私が使用します。

[A-Z]\d[A-Z] \d[A-Z]\d 

とPHPで(アンカーを追加し、文字列全体が一致しているので):

preg_match('/^[A-Z]\d[A-Z] \d[A-Z]\d$/', $string); 

場合は、区切り文字の後にi修飾子を追加するオプションの場合:

preg_match('/^[A-Z]\d[A-Z] \d[A-Z]\d$/i', $string); 

かだけでなく小文字の範囲を追加します。

preg_match('/^[A-Za-z]\d[A-Za-z] \d[A-Za-z]\d$/', $string); 

正規表現デモ:https://regex101.com/r/cG9sG9/1
PHPデモ:https://eval.in/594444(1試合のために、真である)

第一グループと第二の間に空白が使用\h*数量詞または+数量詞のいずれかを変化させることができる場合。 *は必須ではありません(0回以上の出現)。

+0

これは非常に役に立ちました。私は以前にPHPでRegexを使っておらず、W3の学校とPHPサイトで読んだことにちょうど従っていました。しかしこれははるかに理にかなっています。ありがとう! –

3

問題は、この行である:

if(isset($_POST['send_bulkform']) && $_POST['postalcode'] != preg_match("[A\-Za\-z][0\-9][A\-Za\-z] [0\-9][A\-Za\-z][0\-9]",$_POST['postal_code']) || isset($_POST['send_studentform']) && $_POST['postalcode'] != preg_match("[A\-Za\-z][0\-9][A\-Za\-z] [0\-9][A\-Za\-z][0\-9]",$_POST['postal_code'])) 

1 - 不一致の一致のために1または0を返すするpreg_match。だからあなたのテスト:

$_POST['postalcode'] != preg_match(...) 

ほとんどの時間は "true"となります。 ちょうど使用:

if(preg_match(...)) 

2 - するpreg_match内の正規表現は不正な形式です。

preg_match("/[A-Za-z][0-9][A-Za-z] [0-9][A-Za-z][0-9]/",$_POST['postal_code']) 
+1

'preg_match'パターンの最後に'/'がありませんでした。 –

+0

Danielに感謝、あなたは正しいです、私の投稿を編集しました。 –

関連する問題