PHP正则识别中文必须加u修饰符,否则因UTF-8多字节导致匹配失败;推荐用\p{Han}替代\x{4e00}-\x{9fa5},更全面覆盖汉字;注意区分“含中文”与“纯中文”的正则写法。

PHP 通过正则表达式识别中文,核心就两点:写对 Unicode 范围或 Unicode 属性,且必须加 u 修饰符。漏掉 u,几乎所有中文匹配都会失败或报错。
必须加 u 修饰符
PCRE 引擎默认按字节处理字符串。中文在 UTF-8 中是多字节(通常 3 字节),不加 u,\x{4e00} 会被拆成乱码字节,匹配直接失效。
- 错误写法:
preg_match('/[\x{4e00}-\x{9fa5}]+/', $str)→ 可能返回 false 或警告 - 正确写法:
preg_match('/[\x{4e00}-\x{9fa5}]+/u', $str) - 文件本身也需保存为 UTF-8 无 BOM 编码,否则源码里的
\x{4e00}就已损坏
推荐用 \p{Han} 替代固定范围
\p{Han} 是 Unicode 官方定义的“汉字脚本”类别,覆盖简体、繁体、扩展 A/B 区、康熙部首、汉字标点等,比 \x{4e00}-\x{9fa5} 更全、更可靠。
- 匹配任意中文字符:
/\p{Han}/u - 匹配连续中文:
/\p{Han}+/u - 验证纯中文字符串:
/^\p{Han}+$/u - 确认环境支持:
var_dump(pcre_version());查看输出是否含 “Unicode property support”
区分“含中文”和“纯中文”
业务逻辑不同,正则写法差异明显:
立即学习“PHP免费学习笔记(深入)”;
- 只要出现一个中文(如用户名允许中英文混合):
/[\x{4e00}-\x{9fa5}]/u或/\p{Han}/u - 要求全部是中文(如姓名字段校验):
/^[\x{4e00}-\x{9fa5}]+$/u或/^\p{Han}+$/u - 允许中文+数字+字母:
/^[\x{4e00}-\x{9fa5}a-zA-Z0-9]+$/u - 排除中文(只留英文数字符号):
/^[^\x{4e00}-\x{9fa5}]*$/u
提取或替换中文的实用写法
批量操作时注意目标字符串编码一致性,避免混入 GBK 等非 UTF-8 内容。
- 提取所有中文片段:
preg_match_all('/\p{Han}+/u', $str, $matches); // 结果在 $matches[0] - 删除所有中文:
preg_replace('/\p{Han}+/u', '', $str) - 只保留中文(过滤其余字符):
preg_replace('/[^\p{Han}]/u', '', $str)



















