【问题标题】:PHP name validationPHP 名称验证
【发布时间】:2018-02-09 17:33:55
【问题描述】:

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

我对名字和姓氏都使用了“测试”输入,但当它应该允许输入时我仍然得到一个错误,因为 !preg_match('/^[a-z]*$/i', $value) 应该允许大小写字符吗?

另外,我得到的错误似乎只触发了名字而不是姓氏。

<?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;
            }         
        }
}
?>

【问题讨论】:

标签: php regex validation


【解决方案1】:

您的“或”条件周围缺少括号。 “AND”优先于“OR”。

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

注意:在上面的代码中,您有一个 “未定义变量”$error

【讨论】:

    【解决方案2】:

    我建议:

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

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

    这就是实现的样子:(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">
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多