为什么我的PHP没有验证?

时间:2016-06-23 13:51:42

标签: php html validation preg-match

我试图这样做,如果一个人输入错误的邮政编码格式或留下输入null,它将给出一个错误。我试图找出它为什么不起作用。请帮忙!

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

2 个答案:

答案 0 :(得分: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(...)

毫无意义,并且大部分时间都是&#34; true&#34;。 只需使用:

 if(preg_match(...))

2 - preg_match中的Regexp格式不正确。替换:

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 :(得分: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);

正则表达式演示:https://regex101.com/r/cG9sG9/1
PHP演示:https://eval.in/594444(1是真的,匹配)

如果第一个分组和第二个分组之间的空白可以使用\h以及*量词或+量词,则可能会有所不同。 *使其不需要(零次或多次出现)。