ereg的预期寿命,迁移到preg

时间:2011-05-03 14:47:46

标签: php regex ereg

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

我非常清楚为什么ereg被弃用,但显然迁移到preg可能会高度参与。

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

4 个答案:

答案 0 :(得分:2)

我不确定何时删除ereg但我的赌注是从PHP 6.0开始。

关于您的第二个问题(将ereg翻译为preg)似乎并不难,如果您的应用程序具有>一百万行肯定你有资源让一个人最多工作一周。我会grep你代码中的所有ereg_实例,并在你最喜欢的IDE中设置一些宏(简单的东西,如添加分隔符,修饰符等)。

我敢打赌1768个正则表达式中的大多数都可以使用宏来移植,而其他正常情况下,这是一双很好的眼睛。

另一个选项可能是在ereg函数不可用的情况下编写包装器,根据需要实现the changes

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);
    }
}

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


  

与POSIX正则表达式的区别

     

从PHP 5.3.0开始,POSIX正则表达式   不推荐使用扩展名。有一个   POSIX之间的差异数量   正则表达式和PCRE正则表达式。此页面列出   最值得注意的是   必须知道何时转换为   PCRE。

     
      
  1. PCRE函数要求模式由分隔符括起来。
  2.   
  3. 与POSIX不同,PCRE扩展没有专用功能   不区分大小写的匹配。代替,   使用/ i模式支持此功能   修改。其他模式修饰符是   也可以改变   匹配策略。
  4.   
  5. POSIX函数找到最左边匹配的最长时间,但是   PCRE在第一次有效比赛时停止。   如果字符串完全不匹配   没有区别,但如果它匹配   它可能会对两者产生巨大影响   结果匹配和匹配   速度。为了说明这种差异,   考虑以下示例   “掌握正则表达式”   杰弗里弗里德。使用模式   一个(个体经营)?(自给自足)?在...上   用PCRE串起来   会导致匹配自己,但是   使用POSIX结果将是   全字符串自足。都   (子)字符串与原始字符串匹配   字符串,但POSIX要求   最长的结果。
  6.   

答案 1 :(得分:2)

我的直觉说他们永远不会故意删除ereg。 PHP仍然支持像注册全局变量这样的旧的和不赞成的东西。那里有太多过时的应用程序。然而,由于有人发现了一个严重的漏洞并且没有人可以修复它,因此有必要删除扩展名。

无论如何,值得注意的是:

  1. 您无需升级PHP安装。保持过时的服务器运行legady应用程序是很常见的。

  2. PHP_Compat PEAR包提供了一些原生函数的纯PHP版本。如果ereg消失,则可能会被添加。


  3. BTW ......事实上,PHP 6 is dead。他们意识到他们使PHP完全符合Unicode的方法比他们想象的更难,他们正在重新思考这一切。结论是:你永远无法做出完美的预测。

答案 2 :(得分:1)

我在更小的范围内遇到了这个问题 - 一个更像10,000行的应用程序。在每种情况下,我需要做的就是切换到preg_replace()并在正则表达式模式周围添加分隔符。

任何人都应该能够做到这一点 - 即使非程序员也可以获得文件名和行号列表。

然后运行测试以观察可以修复的任何故障。

顺便说一句,

函数将从PHP6中移除 - http://jero.net/articles/php6

答案 3 :(得分:0)

从PHP 6开始,所有ereg函数都将被删除。我相信。