ereg的预期寿命,迁移到preg

Oli*_*ton 8 php regex ereg

我在一个大型PHP应用程序(> 100万行,10岁)上工作,它广泛使用eregereg_replace- 目前在516个类中有1,768个独特的正则表达式.

我非常清楚为什么ereg被弃用但显然preg可以高度参与.

有谁知道ereg在PHP中可能维持多长时间的支持,和/或有任何迁移到preg这种规模的建议.我怀疑从ereg到preg的自动翻译是不可能/不切实际的?

Ali*_*xel 2

我不确定什么时候ereg会被删除,但我打赌从 PHP 6.0 开始。

关于你的第二个问题(翻译eregpreg)似乎并不难,如果你的应用程序有 > 100 万行,那么你肯定有资源让某人最多一周完成这项工作。我会 grepereg_代码中的所有实例,并在您最喜欢的 IDE 中设置一些宏(简单的东西,例如添加分隔符、修饰符等)。

我敢打赌,1768 个正则表达式中的大多数都可以使用宏进行移植,而其他的则很好。

ereg另一种选择可能是在函数不可用时编写包装器,根据需要实现更改:

if (function_exists('ereg') !== true)
{
    function ereg($pattern, $string, &$regs)
    {
        return preg_match('~' . addcslashes($pattern, '~') . '~', $string, $regs);
    }
}

if (function_exists('eregi') !== true)
{
    function eregi($pattern, $string, &$regs)
    {
        return preg_match('~' . addcslashes($pattern, '~') . '~i', $string, $regs);
    }
}
Run Code Online (Sandbox Code Playgroud)

你明白了。此外,PEAR 包 PHP Compat也可能是一个可行的解决方案。


与 POSIX 正则表达式的差异

从 PHP 5.3.0 开始,POSIX Regex 扩展已被弃用。POSIX 正则表达式和 PCRE 正则表达式之间存在许多差异。本页列出了转换为 PCRE 时需要了解的最值得注意的内容。

  1. PCRE 函数要求模式由分隔符括起来。
  2. 与 POSIX 不同,PCRE 扩展没有用于不区分大小写匹配的专用函数。相反,这是使用 /i 模式修饰符支持的。其他模式修饰符也可用于更改匹配策略。
  3. POSIX 函数查找最左边匹配项中最长的一个,但 PCRE 在第一个有效匹配项处停止。如果字符串根本不匹配,则没有什么区别,但如果匹配,则可能会对匹配结果和匹配速度产生巨大影响。为了说明这种差异,请考虑 Jeffrey Friedl 的“掌握正则表达式”中的以下示例。使用模式一(自我)?(自给自足)?在字符串 selfsufficient 上使用 PCRE 将导致匹配 self,但使用 POSIX 结果将是完整的字符串 selfsufficient。两个(子)字符串都与原始字符串匹配,但 POSIX 要求结果是最长的。