2016-06-23 2 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

BTW: Вероятно, не рекомендуется проверять почтовые коды вообще, так как существует [слишком много форматов, используемых во всем мире] (https://en.wikipedia.org/wiki/List_of_postal_codes). Некоторые страны даже используют несколько форматов. – feeela

+1

Что это за регулярное выражение? Это позволит 'A',' -', 'Z',' a', '-' или' z'. Затем либо '0',' -', либо '9'. И т.д. – chris85

ответ

1

Ваше регулярное выражение неверно, и ваше использование PHP неверен. В 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); 

Regex Демонстрация: https://regex101.com/r/cG9sG9/1
РНР Демонстрация: https://eval.in/594444 (1 верно, то на матч)

Если пробел между первой группировкой и вторым может варьироваться в зависимость использования \h и либо * квантора или + квантора. * не требует от него (ноль или более случаев).

+0

Это было очень полезно. Я раньше не использовал Regex в PHP и просто следил за тем, что я читал в школах 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 - preg_match возвращает 1 для матча или 0, если нет матча. Итак, ваш тест:

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

не имеет смысла и будет в большинстве случаев «истинным». Просто используйте:

if(preg_match(...)) 

2 - Regexp внутри preg_match имеет неверный формат. Заменить:

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

с:

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

Вы пропустили '/' в конце шаблона 'preg_match'. –

+0

спасибо, Даниил, ты прав, просто отредактировал мой пост. –