【问题标题】:Two different validation for field yii2字段 yii2 的两种不同验证
【发布时间】:2015-12-27 13:36:16
【问题描述】:

我的应用程序中有一个登录表单 这是我的 LoginForm 模型。

public $login_un;
public $login_pw;
public $remember_me;

public function rules()
{
    return [
        [['login_un', 'login_pw'], 'required'],
        [['login_un'] , 'string', 'min'=> 4, 'max'=>32],
        [['login_pw'] , 'string', 'min'=> 6, 'max'=>32],
        [['login_un'], 'match', 'pattern' => '/^[A-Za-z0-9]{4,32}$/'],
        [['login_pw'], 'match', 'pattern' => '/^[A-Za-z0-9_@%&*]{6,32}$/'],
    ];
}

我想将 login_un 声明为电子邮件和用户名。我已经为用户名写了它的正则表达式,现在我也想使用正则表达式来接受正确的邮件,但是由于正则表达式没有经过全面测试,我不会冒险。 如何将字段定义为电子邮件但允许它与另一个模式匹配?

【问题讨论】:

    标签: php regex validation yii2


    【解决方案1】:

    验证器是 YII2 中名为 'email' 的字符串形式。您只需添加 'string'(用于字符串长度检查)和 'match(用于 regex)。

    请注意,如果为单个字段指定规则,则无需将其放入数组中。

    请查看使用电子邮件验证规则修改的示例,您在Validating Input: Declaring Rules 中找到了解释:

    public $login_un;
    public $login_pw;
    public $remember_me;
    
    public function rules()
    {
        return [
            [['login_un', 'login_pw'], 'required'],
            [['login_un'], 'string', 'min'=> 4, 'max'=>32],
            [['login_un'], 'match', 'pattern' => '/^[A-Za-z0-9]{4,32}$/'],
            ['login_un', 'email'], # <-- Email validation
            [['login_pw'], 'string', 'min'=> 6, 'max'=>32],
            [['login_pw'], 'match', 'pattern' => '/^[A-Za-z0-9_@%&*]{6,32}$/'],
        ];
    }
    

    【讨论】:

    • 感谢您的回复。但是如果我们添加电子邮件类型和正则表达式,它将不会验证无电子邮件输入@hakre
    • 哪个没有电子邮件输入? - 如果这是您想询问的实际情况,请更新您的问题。
    • 正如我在登录表单中提到的,我有三个字段。我希望 login_un 验证为电子邮件 or 用户名。如果输入是电子邮件,则接受但如果不是,请检查用户名正则表达式。
    • IIRC 对于这种或那种类型的验证器,您需要创建自己的验证器:yiiframework.com/doc-2.0/… - 在您的情况下,您将创建一个 UsernameOrEmailValidator
    • 谢谢你的回复哥们:)
    【解决方案2】:

    这可能会容易得多。只需将您的正则表达式保留为用户名并仅在用户名中有 @ 时运行电子邮件验证器,反之亦然。 Yii 验证器具有 when- 属性,您可以在其中提供匿名函数。如果该函数返回布尔值true,则验证器会被执行,否则不会。

    针对您的情况的解决方案:

    [['login_un'], 'string', 'min'=>4, 'max'=>32],
    [['login_un'], 'match', 'pattern'=>'>>>your regular username regex <<<', 'when'=>function($model) {
        return strpos($model->login_un, '@') === false;
    }],
    [['login_un'], 'email', 'when'=>function($model) {
        return strpos($model->login_un, '@') !== false;
    }],
    

    官方文档中解释了该功能的所有细节: http://www.yiiframework.com/doc-2.0/yii-validators-validator.html#$when-detail

    【讨论】:

    • 哦,非常好的答案。非常感谢您的回复
    【解决方案3】:

    我从 yii2 文档中找到了一个经过全面测试的电子邮件正则表达式

    这是我的灵魂

    public function rules()
        {
            return [
                [['login_un', 'login_pw'], 'required'],
                [['login_un'] , 'string', 'min'=> 4, 'max'=>32],
                [['login_pw'] , 'string', 'min'=> 6, 'max'=>32],
                [['login_un'], 'match', 'pattern' => '/^[A-Za-z0-9]{4,32}$|^[a-zA-Z0-9!#$%&\'*+\\/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&\'*+\\/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?$/'],
                [['login_pw'], 'match', 'pattern' => '/^[A-Za-z0-9_@%&*]{6,32}$/'],
            ];
        }
    

    要特别感谢yii2团队samdark

    这里是resource

    【讨论】:

      猜你喜欢
      • 2019-04-18
      • 2023-04-08
      • 2017-05-29
      • 1970-01-01
      • 2015-10-22
      • 2023-03-04
      • 2017-05-24
      • 1970-01-01
      • 2020-06-15
      相关资源
      最近更新 更多