我的申请表中有登录表单 这是我的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声明为电子邮件和用户名。我已经为用户名编写了正则表达式,我现在也希望使用正则表达式来接受正确的邮件,但由于正则表达式没有经过全面测试,我不会冒险。 如何将字段定义为电子邮件但允许其与其他模式匹配?
答案 0 :(得分: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}$/'],
];
}
答案 1 :(得分:1)
这可能会容易得多。只需在用户名中留下正则表达式,并仅在用户名中有@
时运行电子邮件验证程序,反之亦然。 Yii-validators具有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# $当细节
答案 2 :(得分:0)
我找到了来自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