PHP 8.0 中 preg_match 匹配中文必须加 u 修饰符,否则按字节处理会导致错位;推荐用 \p{Han} 替代手动 Unicode 范围,并确保输入为合法 UTF-8。

在 PHP 8.0 中,preg_match 默认使用字节模式,无法直接正确匹配中文(UTF-8 编码的多字节字符),必须启用 u(UTF-8)修饰符,否则可能匹配失败、截断或产生乱码结果。
必须加 u 修饰符
中文字符在 UTF-8 中通常占 3 个字节(如“你好”),而默认 PCRE 正则按单字节处理,会导致匹配错位。加上 u 后,正则引擎以 Unicode 码点为单位处理字符,才能准确识别中文。
- ✅ 正确:
preg_match('/^[\x{4e00}-\x{9fa5}]+$/u', $str) - ❌ 错误:
preg_match('/^[\x{4e00}-\x{9fa5}]+$/ ', $str)(缺 u)
推荐用 \p{Han} 匹配所有汉字
\p{Han} 是 Unicode 属性类,能匹配中日韩统一汉字区块(含简体、繁体、日文汉字、康熙部首等),比手动写范围更全面、可读性更强。
- 匹配纯中文字符串:
preg_match('/^\p{Han}+$/u', $str) - 匹配含中文、数字、字母、下划线的用户名:
preg_match('/^[\p{Han}\w]+$/u', $str) - 注意:
\w在u模式下也支持 Unicode 字母和数字,但建议显式加u保险
常见中文匹配场景写法
根据实际需求选择合适模式,始终带上 u:
立即学习“PHP免费学习笔记(深入)”;
- 中文+空格+英文混合(如“张三 Smith”):
/^[\p{Han}\p{L}\s]+$/u - 至少一个中文字符:
/\p{Han}/u - 提取所有中文:
preg_match_all('/\p{Han}+/u', $text, $matches) - 排除中文(只留英文、数字、符号):
preg_replace('/[\p{Han}]+/u', '', $str)
验证字符串是否为合法 UTF-8 很重要
如果输入字符串本身不是有效的 UTF-8(比如 GBK 编码未转码),即使加了 u 也会匹配失败或报错。
- 检查:
if (!mb_check_encoding($str, 'UTF-8')) { /* 非 UTF-8,需转换 */ } - 转换(如有必要):
$str = mb_convert_encoding($str, 'UTF-8', 'GBK');



















