PHP 7 彻底移除了 ereg 系列函数,必须替换为 preg_match 等 PCRE 函数;需添加分隔符、调整修饰符、修正转义,并注意返回值与捕获逻辑差异。

PHP 7 中 ereg 确实被彻底移除了,不能只是“替换函数名”
ereg 及其家族(eregi、ereg_replace、eregi_replace)在 PHP 5.3.0 被标记为废弃,PHP 7.0 正式删除。直接运行含 ereg 的代码会报致命错误:Fatal error: Uncaught Error: Call to undefined function ereg()。这不是警告,是中断执行——必须改。
用 preg_match 替换 ereg 的核心差异点
二者语法不兼容,不能简单把 ereg($pattern, $string) 改成 preg_match($pattern, $string)。关键区别有:
-
preg_match要求正则模式以分隔符开头和结尾(常用/),而ereg不需要。例如:ereg('^a.*b$', $s)→preg_match('/^a.*b$/', $s) -
ereg默认大小写敏感,eregi是不敏感;preg_match统一靠修饰符控制,不敏感要加i:如/pattern/i -
ereg返回匹配次数(0 或 1),preg_match返回 1(匹配)、0(不匹配)、false(正则语法错)。别用返回值做布尔判断时漏判 false - 转义规则不同:
ereg对反斜杠处理更宽松;preg遵循 PCRE 标准,字符串中反斜杠需双写(\\d而非\d),尤其在双引号字符串里
常见迁移场景与实操写法
以下对比真实旧代码片段和推荐新写法(注意分隔符、修饰符、转义):
旧:if (ereg('^[0-9]+$', $input)) { ... }
新:if (preg_match('/^[0-9]+$/D', $input) === 1) { ... }(D 修饰符避免 $ 匹配末尾换行,行为更接近 ereg)
立即学习“PHP免费学习笔记(深入)”;
旧:eregi('hello', $text)
新:preg_match('/hello/i', $text)
旧:ereg_replace('[ \t\n\r]+', ' ', $str)
新:preg_replace('/[ \t\n\r]+/', ' ', $str)(注意:这里用 preg_replace,不是 preg_match)
如果原逻辑依赖 ereg 的子模式捕获(第三个参数),对应改用 preg_match 的 $matches 参数:ereg('([a-z]+)@([a-z.]+)', $email, $regs) → preg_match('/([a-z]+)@([a-z.]+)/i', $email, $matches),之后 $matches[1] 和 $matches[2] 含对应内容
容易踩的坑:PCRE 兼容性与性能隐含变化
PHP 7 默认使用 PCRE2(PHP 7.3+),比旧 PCRE 更严格。某些过去能过的模糊正则(比如未闭合括号、空量词)现在会直接报 PREG_BAD_PATTERN 错误。
- 检查所有迁移后的正则是否加了分隔符,且成对出现
- 避免在
preg_match第一个参数里漏掉修饰符(如该不区分大小写却没加i) -
preg_match在大文本上可能比ereg略慢,但通常可忽略;若高频调用,考虑用preg_match+PREG_UNMATCHED_AS_NULL(PHP 7.2+)减少数组开销 - 不要用
set_error_handler捕获preg_*的警告——它抛的是E_WARNING,但 PHP 7 下部分错误已升级为Exception,需 try/catch
最麻烦的往往不是主逻辑,而是散落在 include 文件、模板、老配置里的正则片段——建议用 grep -r "ereg\|eregi\|ereg_replace" . --include="*.php" 全项目扫一遍,逐个确认上下文再改。











