PHP名称验证

时间:2018-02-09 17:33:55

标签: php regex validation

我一直在为注册表单创建一些验证,在验证用户名时遇到错误。

我在firstname和lastname上都使用了“Test”输入,当它应该允许输入时我仍然会收到错误,因为 !preg_match('/^[a-z]*$/i', $value)应该允许使用小写和大写字符吗?

我得到的错误似乎只是触发了firstname而不是姓氏。

<?php 
   if (isset($_POST['submit'])){
        require_once 'config.php';

        $errors = [];

        foreach($_POST as $field => $value){
            if($field === 'firstname' || $field === 'lastname' && !preg_match('/^[a-z]*$/i', $value)){
                $errors[] = "{$field} has invalid characters please try again.";
                echo $error;
            }         
        }
}
?>

2 个答案:

答案 0 :(得分:1)

您的&#34; OR&#34;周围缺少方括号。条件。 &#34; AND&#34;优先于&#34; OR&#34;。

if(($field === 'firstname' || $field === 'lastname') && !preg_match('/^[a-z]*$/i', $value)){
     $errors[] = "{$field} has invalid characters please try again.";
}

注意:在上面的代码中,您有一个&#34;未定义的变量&#34; $error

答案 1 :(得分:0)

我建议:

  1. 您使用:in_array($key,['firstname','lastname'])而不是两次单独的检查,使您的条件更直接/简短/干燥。

  2. 当存在旨在执行相同任务的非正则表达式函数时,您可以避免不必要地使用正则表达式函数:!ctype_alpha($value)

  3. 这是实现的样子:(Demo

    $_POST=['submit'=>'','firstname'=>'legit','lastname'=>'n0tl3g!t'];
    
    $errors=[];
    foreach($_POST as $key=>$value){
        if(in_array($key,['firstname','lastname']) && !ctype_alpha($value)){
            $errors[]="$key field contains invalid value: $value";
        }
    }
    var_export($errors);
    

    输出:

    array (
      0 => 'lastname field contains invalid value: n0tl3g!t',
    )
    

    至于改善应用程序的用户体验,我建议在表单中使用HTML5验证,以防止提交无效的字段值,如此...

    <input type="text" name="firstname" required pattern="[a-zA-Z]+" placeholder="letters only">