我在一个大型PHP应用程序(> 100万行,10岁)上工作,它广泛使用ereg和ereg_replace- 目前在516个类中有1,768个独特的正则表达式.
我非常清楚为什么ereg被弃用但显然preg可以高度参与.
有谁知道ereg在PHP中可能维持多长时间的支持,和/或有任何迁移到preg这种规模的建议.我怀疑从ereg到preg的自动翻译是不可能/不切实际的?
我不确定什么时候ereg会被删除,但我打赌从 PHP 6.0 开始。
关于你的第二个问题(翻译ereg为preg)似乎并不难,如果你的应用程序有 > 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 时需要了解的最值得注意的内容。
- PCRE 函数要求模式由分隔符括起来。
- 与 POSIX 不同,PCRE 扩展没有用于不区分大小写匹配的专用函数。相反,这是使用 /i 模式修饰符支持的。其他模式修饰符也可用于更改匹配策略。
- POSIX 函数查找最左边匹配项中最长的一个,但 PCRE 在第一个有效匹配项处停止。如果字符串根本不匹配,则没有什么区别,但如果匹配,则可能会对匹配结果和匹配速度产生巨大影响。为了说明这种差异,请考虑 Jeffrey Friedl 的“掌握正则表达式”中的以下示例。使用模式一(自我)?(自给自足)?在字符串 selfsufficient 上使用 PCRE 将导致匹配 self,但使用 POSIX 结果将是完整的字符串 selfsufficient。两个(子)字符串都与原始字符串匹配,但 POSIX 要求结果是最长的。