Php 字段yii2的两种不同验证

Php 字段yii2的两种不同验证,php,regex,validation,yii2,Php,Regex,Validation,Yii2,我的申请表中有一个登录表单 这是我的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], [['l

我的申请表中有一个登录表单 这是我的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}$/'],
    ];
}
我想声明登录名为电子邮件和用户名。我已经为用户名编写了正则表达式,现在我想使用正则表达式来接受正确的邮件,但由于正则表达式没有经过充分测试,我不会冒险使用它。
如何将字段定义为电子邮件,但允许它与其他模式匹配?

在YII2中,验证程序是以字符串形式命名的
'email'
。您只需添加is,就像添加
'string'
(用于字符串长度检查)和
'match
(用于正则表达式)一样

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

请参见使用电子邮件验证规则修改的示例,您可以在以下内容中找到解释:

public$login\u un;
公众$login_pw;
公共资金:记住我;
公共职能规则()
{
返回[
[['login\u un','login\u pw'],'required'],
[['login_un'],'string','min'=>4','max'=>32],
[['login_un'],'match','pattern'=>'/^[A-Za-z0-9]{4,32}$/'],
['login_un','email'],#6',max'=>32],
[['login_pw'],'match','pattern'=>'/^[A-Za-z0-9%&*]{6,32}$/'],
];
}

我从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团队


这里是

这可能会容易得多。只需将regex保留为用户名,仅当用户名中有
@
时才运行电子邮件验证程序,反之亦然。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;
}],
[['login\u un'],'string','min'=>4','max'=>32],

['login_un'],'match','pattern'=>'>>>>您的常规用户名regex谢谢您的回复。但是如果我们添加电子邮件类型和正则表达式,它将不会验证none-email input@Hakrewich none-email input?-如果这是您想要询问的实际情况,请更新您的问题。正如我在登录表单中提到的,我有三个字段。我想要gin_unvalidate as email
username。如果输入是email,则接受,但如果不是,则检查用户名regex.IIRC以了解这种或那种类型的验证器,您需要创建一个自己的验证器:-在您的情况下,您将创建一个用户名或邮件验证器。感谢您的回复,伙计:)哦,回答得很好。非常感谢您的回复
[['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;
}],