我在大型PHP应用程序(> 100万行,10岁)上工作,广泛使用ereg
和ereg_replace
- 目前在516个类中有1,768个独特的正则表达式。
我非常清楚为什么ereg
被弃用,但显然迁移到preg
可能会高度参与。
是否有人知道在PHP中可能会维持ereg
支持多长时间,和/或对此规模迁移到preg
有任何建议。我怀疑从ereg到preg的自动翻译是不可能/不切实际的?
答案 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。
- PCRE函数要求模式由分隔符括起来。
- 与POSIX不同,PCRE扩展没有专用功能 不区分大小写的匹配。代替, 使用/ i模式支持此功能 修改。其他模式修饰符是 也可以改变 匹配策略。
- POSIX函数找到最左边匹配的最长时间,但是 PCRE在第一次有效比赛时停止。 如果字符串完全不匹配 没有区别,但如果它匹配 它可能会对两者产生巨大影响 结果匹配和匹配 速度。为了说明这种差异, 考虑以下示例 “掌握正则表达式” 杰弗里弗里德。使用模式 一个(个体经营)?(自给自足)?在...上 用PCRE串起来 会导致匹配自己,但是 使用POSIX结果将是 全字符串自足。都 (子)字符串与原始字符串匹配 字符串,但POSIX要求 最长的结果。
醇>
答案 1 :(得分:2)
我的直觉说他们永远不会故意删除ereg
。 PHP仍然支持像注册全局变量这样的旧的和不赞成的东西。那里有太多过时的应用程序。然而,由于有人发现了一个严重的漏洞并且没有人可以修复它,因此有必要删除扩展名。
无论如何,值得注意的是:
您无需升级PHP安装。保持过时的服务器运行legady应用程序是很常见的。
PHP_Compat PEAR包提供了一些原生函数的纯PHP版本。如果ereg
消失,则可能会被添加。
BTW ......事实上,PHP 6 is dead。他们意识到他们使PHP完全符合Unicode的方法比他们想象的更难,他们正在重新思考这一切。结论是:你永远无法做出完美的预测。
答案 2 :(得分:1)
我在更小的范围内遇到了这个问题 - 一个更像10,000行的应用程序。在每种情况下,我需要做的就是切换到preg_replace()
并在正则表达式模式周围添加分隔符。
任何人都应该能够做到这一点 - 即使非程序员也可以获得文件名和行号列表。
然后运行测试以观察可以修复的任何故障。
顺便说一句,函数将从PHP6中移除 - http://jero.net/articles/php6。
答案 3 :(得分:0)
从PHP 6开始,所有ereg
函数都将被删除。我相信。