我不确定ereg
何时会被移除,但我猜测可能是在PHP 6.0。
关于你的第二个问题(将ereg
转换为preg
),这似乎并不难,如果你的应用程序有超过100万行代码,那么你肯定有资源让某人在一周内完成这项工作。我会在你的代码中搜索所有ereg_
实例,并在你最喜欢的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);
}
}
你明白了。此外,
PEAR包PHP Compat 也可能是一个可行的解决方案。
与POSIX正则表达式的区别
从PHP 5.3.0开始,POSIX Regex扩展已被弃用。POSIX正则表达式和PCRE正则表达式之间存在许多差异。本页列出了在转换为PCRE时需要了解的最显著的差异。
- PCRE函数要求模式由定界符括起来。
- 与POSIX不同,PCRE扩展没有专门的函数进行大小写不敏感匹配。相反,这是使用/i模式修饰符支持的。还有其他模式修饰符可用于更改匹配策略。
- POSIX函数查找最左侧匹配的最长匹配,但是PCRE会停止在第一个有效匹配上。如果字符串根本不匹配,则没有任何影响,但如果匹配,则可能对结果匹配和匹配速度产生重大影响。为了说明这种差异,请考虑Jeffrey Friedl的“掌握正则表达式”中的以下示例。在字符串oneselfsufficient上使用one(self)?(selfsufficient)?模式,使用PCRE将导致匹配oneself,但使用POSIX的结果将是完整字符串oneselfsufficient。两个(子)字符串都匹配原始字符串,但POSIX要求最长的是结果。
ereg
自PHP 4.1左右就已经被弃用了,但仅仅是因为它不像PCRE函数那样优化。它不太可能很快被移除(至少在神话般的PHP6中不会),即使被移除了,编写一个运行时兼容性支持包装器也很简单(你应该为测试而这样做)。您应该列举一些例子,说明您认为您的posix扩展正则表达式可能不兼容。差异很少显著。 - marioereg
转换为preg
;例如RegexBuddy,它可以支持COM自动化。根据你的正则表达式的复杂程度以及是否需要迁移,这可能是一个相关的选择。 - Tim Pietzcker