必须加 u 修饰符,否则 preg_match 处理中文、emoji 等 utf-8 字符时会失败或乱码;u 强制 pcre 以 utf-8 模式运行,支持 unicode 转义、代理对识别及 \p{...} 属性类。

不加 u 修饰符,PHP 的 preg_match 处理中文、emoji、生僻字时大概率失败或返回乱码。这不是“建议加”,而是面对 UTF-8 字符串时的硬性要求。
preg_match 匹配中文直接返回空或乱码
PHP 的 PCRE 库默认按字节(而非 Unicode 字符)解析正则和目标字符串。一个汉字如“你”在 UTF-8 中占 3 字节,在 PCRE 内部若未启用 u,会被当作非法字节序列或拆成多个无效单元处理:
-
preg_match('/[\x{4e00}-\x{9fff}]/', '你好', $m)→ 报错Compilation failed: PCRE does not support \x{} for non-UTF-8 patterns或返回false -
preg_match('/./', '?', $m)→ 可能只匹配前两个字节,$m[0]是乱码(如"") - 即使模式写成
/[一-龯]/这类 GBK 风格范围,也因编码不匹配而完全不生效
u 修饰符强制 PCRE 以 UTF-8 模式运行
加上 u 后,PCRE 才会:
- 正确解析
\x{4e00}这类花括号 Unicode 转义(不加u会被当成字面量x{4e00}) - 把代理对(如 emoji
\uD83D\uDC2A)识别为单个字符,而非两个独立码元 - 让
\w、\s、.等元字符覆盖完整 Unicode 字符集(例如\w在u模式下才匹配汉字) - 支持
\p{Script=Han}、\p{Emoji}等 Unicode 属性类(缺u直接语法报错)
常见错误组合:/u 忘了配 /s 或 /m
u 解决的是字符编码层面的问题,但它不解决换行或多行锚定问题。实际写业务正则时容易漏掉配套修饰符:
- 想用
.匹配含换行的文本?必须同时加s:/pattern/su - 想在多行字符串中用
^或$匹配每行首尾?得加m:/^abc$/mu - 单独写
/u不能让.跨换行,也不能让^匹配中间行首——这是三个独立开关
真正麻烦的地方在于:错误不总立刻报异常。有时 preg_match 返回 false 或空数组,但你查半天发现只是少了个 u;有时它甚至“凑巧”匹配上几个 ASCII 字符,掩盖了对中文完全失效的事实。只要目标字符串含 UTF-8 多字节字符,u 就不是可选项。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











