ThinkPHP regex验证需显式指定php驱动并加/u修饰符,Unicode转义用双反斜杠,推荐正则:/^[x{4e00}-x{9fa5}x{3400}-x{4dbf}x{20000}-x{2a6df}x{2a700}-x{2b73f}x{2b740}-x{2b81f}x{2b820}-x{2ceaf}·-s]+$/u。

ThinkPHP 的 regex 验证规则对中文支持不默认生效
ThinkPHP 内置的 regex 验证(比如 ['name', 'regex', '/^[x{4e00}-x{9fa5}]+$/u'])在 PHP 环境下能匹配中文,但实际跑不通——常见报错是 preg_match(): Compilation failed: PCRE does not support L, l, N, P, p, U, u, or X 或直接跳过验证。根本原因是 ThinkPHP 5.1+ 默认把正则传给 filter_var() 做兜底,而它不支持 /u 修饰符和 Unicode 属性。
- 必须显式指定验证器驱动为
php,绕过 filter_var - 正则本身要加
/u修饰符,否则 x{4e00} 类写法无效 - ThinkPHP 6.0+ 中
regex规则默认已改用preg_match,但仍建议显式声明驱动
中文名常用正则怎么写才稳妥
别直接抄 /^[u4e00-u9fa5]+$/ ——它漏掉中文标点、全角数字、平假名/片假名(某些场景需要),也拦不住空格或连接符。真实业务里「张三」、「李小龍」、「山田太郎」、「王-小明」都得过。
-
/^[x{4e00}-x{9fa5}x{3400}-x{4dbf}x{20000}-x{2a6df}}x{2a700}-x{2b73f}}x{2b740}-x{2b81f}}x{2b820}-x{2ceaf}}·-·s]+$/u:覆盖基本汉字、扩展 A/B 区、中文顿号、中间点、短横线、全角空格 - 如果允许英文名混输(如「John 张」),加
a-zA-Z和常见西文空格:/^[x{4e00}-x{9fa5}a-zA-Zs·-]+$/u - 开头结尾不能是空格或符号?补上
^S.*S$或用trim预处理更可靠
验证器里怎么写才不被自动转义或截断
ThinkPHP 对验证规则字符串会做一次 str_replace 处理(比如把 当转义符提前解析),导致 x{4e00} 被吃掉一个反斜杠,变成 x{4e00},正则直接失效。
- 所有 Unicode 转义必须用双反斜杠:
'regex' => '/^[\x{4e00}-\x{9fa5}]+$/u' - 或者换用字符串变量拼接,避免硬编码:
$chinese = 'x{4e00}-x{9fa5}'; $rule = '/^[' . $chinese . ']+$/u'; - 验证器类中推荐用
protected $rule = [...]数组定义,而非动态validate()->rule(...),后者容易触发额外解析
测试时发现部分生僻字还是不匹配
不是正则写错了,是 PHP 的 PCRE 版本太低(x{20000} 这种四字节 Unicode 就会静默失败。
立即学习“PHP免费学习笔记(深入)”;
- 运行
php -r "echo PCRE_VERSION;"查版本,低于 8.32 建议升级系统或重装 PHP - 临时兼容方案:用
mb_ereg()替代,但需关闭mbstring.func_overload,且 ThinkPHP 不原生支持,得自定义验证方法 - 生产环境务必用
mb_strlen($value, 'UTF-8') > 0+ 正则双重校验,防绕过
Unicode 汉字范围本身在持续扩展,靠正则穷举不如结合语义过滤(比如禁用「〇」「卐」等敏感字),而且用户真要输「?」这种字,大概率是故意的——该拦的不是字形,是业务逻辑边界。



















