Yii2中校验中文参数需用mb_strlen()和/u正则修饰符,推荐内联验证器(简单场景)或自定义ChineseValidator类(多模型复用),并确保UTF-8编码统一、避免strlen误用及BOM问题。

Yii2 中自定义规则校验中文参数,关键在于正确处理 UTF-8 编码、正则表达式修饰符和验证逻辑的封装。直接用 filter 或 required 无法满足如“必须为 2–10 个中文字符”这类需求,需通过继承 Validator 或使用 inline validator 实现。
使用 inline validator 校验中文长度与格式
适合简单、局部复用的场景,例如模型中限制姓名字段为 2–5 个中文字符:
- 在模型类(如
UserForm)的rules()方法中添加内联验证器 - 正则使用
/^[\x{4e00}-\x{9fa5}]{2,5}$/u,u修饰符确保支持 Unicode - 注意:PHP 的
strlen()对中文返回字节数,应改用mb_strlen($value, 'UTF-8')
示例代码:
public function rules()
{
return [
[['name'], function ($attribute) {
$value = $this->$attribute;
if (!is_string($value) || mb_strlen($value, 'UTF-8') < 2 || mb_strlen($value, 'UTF-8') > 5) {
$this->addError($attribute, '姓名必须是2到5个中文字符');
return;
}
if (!preg_match('/^[\x{4e00}-\x{9fa5}]+$/u', $value)) {
$this->addError($attribute, '姓名只能包含中文');
}
}],
];
}
创建独立的中文字符串验证器类
适合多模型复用、逻辑较复杂(如支持中英文混合、排除生僻字、校验手机号/身份证中的中文部分)的场景。
- 新建文件
common/validators/ChineseValidator.php - 继承
\yii\validators\Validator,重写validateAttribute() - 通过
$this->min、$this->max等属性支持配置化
示例代码:
namespace common\validators;
use yii\validators\Validator;
class ChineseValidator extends Validator
{
public $min = 1;
public $max = 20;
public function validateAttribute($model, $attribute)
{
$value = $model->$attribute;
if (!is_string($value)) {
$this->addError($model, $attribute, '请输入有效的字符串');
return;
}
$len = mb_strlen($value, 'UTF-8');
if ($len < $this->min || $len > $this->max) {
$this->addError($model, $attribute, "请输入{$this->min}–{$this->max}个中文字符");
return;
}
if (!preg_match('/^[\x{4e00}-\x{9fa5}]+$/u', $value)) {
$this->addError($model, $attribute, '只能包含中文字符');
}
}
}
在模型中使用:
public function rules()
{
return [
[['real_name'], common\validators\ChineseValidator::class, 'min' => 2, 'max' => 10],
];
}
注意事项与避坑点
中文校验容易因编码或函数误用导致失效,以下几点务必确认:
- 确保 PHP 文件本身保存为 UTF-8 无 BOM 格式(尤其 Windows 下编辑器易带 BOM)
- 数据库字段、连接、HTTP 请求头均需统一 UTF-8(如 MySQL 设置
charset=utf8mb4) - 避免用
strlen()判断中文长度,必须用mb_strlen($str, 'UTF-8') - 正则中
\x{4e00}-\x{9fa5}覆盖常用汉字,但不含全角标点、emoji、扩展 A/B 区汉字;如需更全范围,可补充\x{3400}-\x{4dbf}\x{20000}-\x{2a6df}}等 - 表单提交时若前端未设置
<meta charset="UTF-8">或 AJAX 未指定contentType: 'application/x-www-form-urlencoded; charset=UTF-8',可能传入乱码导致验证始终失败
配合客户端做基础提示(增强体验)
服务端验证不可省略,但加一层 JS 提示能提升交互友好度:
- 用相同正则做实时输入检测:
/^[\u4e00-\u9fa5]{2,10}$/.test(value) - 注意:JS 中 Unicode 范围写法为
\u4e00-\u9fa5,无需x{...}和u修饰符 - 推荐搭配 Yii2 的
enableClientValidation开启客户端验证(需配置validationUrl或使用默认规则)
在视图中启用:
<?= $form->field($model, 'real_name')->textInput(['maxlength' => true]) ?>
并在模型中确保该字段规则被客户端识别(如使用内置 string + length 规则,或自定义 validator 实现 clientValidateAttribute() 方法)。


















