thinkphp 8.0未改动_regex属性结构,但要求正则必须带分隔符和u修饰符、禁用命名捕获组、空值需显式加require、禁用高级正则特性,并强制验证器严格生成与加载。

正则不再“开箱即用”,必须带分隔符和修饰符
TP 8.0 仍支持 `_regex` 属性,但要求你写的正则字符串必须是完整可执行的 PCRE 模式:
- 必须包含起始与结束分隔符(如 #^1[3-9]d{9}$#u,不能只写
^1[3-9]d{9}$) - 含中文、emoji 或 Unicode 字符时,必须加 u 修饰符,否则匹配失败或错位
- 反斜杠在 PHP 字符串中需双写,例如
d要写成\d - 不推荐用
/做分隔符(易与邮箱、URL 中的斜杠冲突),建议用#或~
默认开启严格模式,命名捕获组可能报错
TP 8.0 验证器默认启用 strict 模式,若 `_regex` 中误用了未定义的命名捕获组(如 (?P<name>...)</name>),会直接抛出 PcreException;而旧版常静默忽略。
稳妥做法是统一使用数字捕获组 (...),避免命名组带来的兼容风险。
空值不触发_regex,require需显式声明
`_regex` 规则默认跳过空字符串(包括 null、''、[]),即使字段有值但为空也不会校验。
若需对空值也执行正则检查,必须显式加上 require:
- ✅ 正确:
'mobile' => 'require|regex'(空值也会走 regex) - ❌ 错误:
'mobile' => 'regex'(空值直接跳过,不校验)
复杂逻辑应拆解,别硬塞进单条正则
TP 8.0 明确不支持正则中的高级特性,比如:
- 条件表达式(
(?(?=...))) - 递归模式(
(?R)) - 回溯控制动词(
(*SKIP)等)
推荐做法是:
- 用 `_regex` 做基础结构兜底(如格式、长度、字符集)
- 用 `function` 类型规则做语义判断(如“不能全为数字”“必须含大写字母”)
- 多规则组合默认是“且”关系,不会跳过任一校验
验证器类生成与加载更严格
手动创建验证器文件极易出错。TP 8.0 强制要求:
- 必须用命令行生成:
php think make:validate UserValidate - 文件路径必须为
app/validate/UserValidate.php,不能放错目录 - 首行必须有
declare(strict_types=1);,否则强类型校验失效 - 类名、命名空间、继承关系必须与生成器一致,否则
Class not found
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











