php 7.0 起 ereg 系列函数已彻底删除,必须改用 preg_* 函数;需注意定界符、返回值逻辑、u/m/i 修饰符、捕获组引用及 utf-8 编码统一。

PHP 7.0 起,ereg、eregi、ereg_replace 等函数已彻底删除,无法通过任何配置或扩展恢复;所有旧代码必须改用 preg_match、preg_replace 等 PCRE 函数才能运行。
preg_match 与 ereg 的调用差异
最直观的坑是定界符和返回值逻辑反转:旧代码 if (ereg("^[a-z]+$", $str)) 在 PHP 7 下会永远走 false 分支,因为 preg_match 成功时返回 1(真值),失败才返回 0;而 ereg 成功返回匹配长度(非零即真),失败才返回 false。
- 必须加定界符:
ereg("hello", $str)→preg_match("/hello/", $str) - 大小写忽略改用修饰符:
eregi("hello", $str)→preg_match("/hello/i", $str) - 多行模式需显式加
m:preg_match("/^start/m", $str),否则^只匹配开头 - 中文匹配必须加
u且字符串为 UTF-8:preg_match("/[x{4e00}-x{9fff}]+/u", mb_convert_encoding($str, 'UTF-8', 'AUTO'))
preg_replace 中捕获组引用的写法陷阱
旧 ereg_replace 允许在替换字符串中直接写 ,但 preg_replace 默认只认 ,且双引号下需注意反斜杠转义。
- 错误写法:
preg_replace("/(d+)/", "$1", $str)→ 输出字面量$1,不替换 - 正确写法(推荐单引号):
preg_replace("/(d+)/", '$1', $str) - 若用双引号,需写成
"\1"(两个反斜杠才生成一个) - 命名捕获更安全:
preg_replace("/(?P<digit>d+)/", '${digit}', $str)</digit>
mb_ereg_* 函数在 PHP 7.3+ 已废弃
虽然 mb_ereg 系列曾提供多字节支持,但 PHP 7.3 起已废弃其别名(如 mb_eregi),且官方明确建议迁移到 preg_* + u 修饰符组合。
-
mb_ereg("国", $str)应改为preg_match("/国/u", $str) - 命名捕获在
mb_ereg_replace中虽支持k<name></name>,但该函数本身已弃用,不应新用 - 性能上,现代
preg_*在 UTF-8 场景下已优化,无需额外依赖mbstring扩展
最容易被忽略的是:迁移后没检查条件判断逻辑是否反转,以及中文匹配漏掉 u 修饰符或源字符串编码未统一为 UTF-8 —— 这两类问题在测试时往往无报错,但正则静默失效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











