8

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

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

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

4

4 回答 4

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

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


与 POSIX 正则表达式的区别

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

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

我的直觉说他们永远不会ereg故意移除。PHP 仍然支持非常古老和已弃用的东西,例如寄存器全局变量。那里有太多过时的应用程序。然而,由于有人发现了一个严重的漏洞并且没有人修复它,因此必须删除扩展程序的可能性很小。

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

  1. 您不会被迫升级您的 PHP 安装。保留过时的服务器以运行旧版应用程序是很常见的。

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


顺便说一句...事实上,PHP 6 已经死了。他们意识到他们让 PHP 完全兼容 Unicode 的方法比他们想象的要难,他们正在重新考虑这一切。结论是:你永远无法做出完美的预测。

于 2011-05-03T15:12:32.367 回答
1

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

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

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

顺便说一下,ereg 函数将从 PHP6 中删除 - http://jero.net/articles/php6

于 2011-05-03T14:59:44.140 回答
0

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

于 2011-05-03T14:55:52.113 回答