PHP ereg与preg的区别

39

我注意到在PHP的正则表达式库中,有两种选择:ereg和preg。它们之间有什么区别?其中一个更快吗?如果是这样,为什么没有弃用较慢的那一个?

在哪些情况下使用其中一种比使用另一种更好?

5个回答

42

访问php.net/ereg会显示如下内容:

警告

自PHP 5.3.0起,此函数已被弃用,并在PHP 6.0.0中移除。建议不要依赖此功能。

向下滚动页面,我们会看到以下内容:

注意: 使用Perl兼容的正则表达式语法的preg_match()通常是 ereg() 的更快的替代品

请注意我的强调。


啊,好的,谢谢。不知道为什么我没看到那个。再见ereg,我想!接受答案。 - Evernoob
6
正如Percy所指出的,mb_ereg_match()和其他多字节ereg函数并未被弃用。 - Benjamin Atkin

20

preg是Perl兼容正则表达式库
ereg是POSIX兼容的正则表达式库

它们有稍微不同的语法,preg在某些情况下略微更快。ereg已被弃用(并且在php6中被删除),因此不建议使用。


5
尽管ereg在PHP 5.3中已被弃用,但mb_ereg*函数并未被弃用。我认为主要原因是因为PHP6正在重建所有MB / Unicode支持,因此旧的“常规”ereg方法是无用的,因为mb_ereg将是更新/更好的选择。
我知道这并没有回答有关速度的问题,但它允许您继续使用POSIX和PCRE。

5

关于哪个更快更好,有很多讨论。

如果您计划将来升级到PHP6,那么您的决定已经做出。否则:

一般共识是PCRE是更好的解决方案,但如果您有一个具有大量流量的特定页面,并且您不需要PHP6,那么进行一些测试可能是值得的。 例如,来自PHP手册评论:

在PHP中废弃POSIX正则表达式以进行Perl搜索,就像用预制房间和墙壁替换带有木板和砖块的房屋一样。当然,您可能能够混合和匹配其中的某些部分,但在所有零件都摆在您面前时,修改起来要容易得多。
PCRE比POSIX RE更快吗?并非总是如此。在Cynergi的最近一个搜索引擎项目中,我有一个简单的循环,其中包含几个可爱的ereg_replace()函数,需要3分钟才能处理数据。我将那个10行循环更改为100行手写代码进行替换,现在该循环只需要10秒即可处理相同的数据!这让我意识到,在某些情况下,正则表达式可能会非常缓慢。最近,我决定研究与Perl兼容的正则表达式(PCRE)。大多数页面声称PCRE比POSIX更快,但有少数声称相反。我决定进行自己的基准测试。我的前几个测试证实了PCRE更快,但是......结果略有不同于其他人得到的结果,因此我决定对我在Cynergi的8000行安全(且快速)Webmail项目上使用的每种RE用法进行基准测试。结果?不确定!有时候PCRE确实更快(有时候快了100倍以上!),但有时候POSIX RE更快(2倍左右)。我仍然需要找到一个规则,即何时使用其中之一更快。这不仅涉及搜索数据大小,匹配的数据量或“RE编译时间”,后者将显示您经常重复函数的时间:一个始终比另一个快。但是我在这里没有找到模式。但说实话,我也没有花时间查看源代码并分析问题。我可以给你一些例子。 POSIX RE([0-9] {4})/([0-9] {2})/([0-9] {2})[^ 0-9] +([0-9] {2}):([0-9] {2}):([0-9] {2})在POSIX中比转换为PCRE快30%(即使您使用\d和\D和非贪婪匹配)。另一方面,类似的PCRE复杂模式/[0-9]{1,2}[ \t]+[a-zA-Z]{3}[ \t]+[0-9]{4}[ \t]+[0-9]{1,2}:[0-9]{1,2}(:[0-9]{1,2})?[ \t]+[+-][0-9]{4}/比POSIX RE快2.5倍。像ereg_replace(“[^ a-zA-Z0-9-] +”,“”,$ m)这样的简单替换模式在POSIX RE中比PCRE快2倍。然后我们再次感到困惑,因为像(^ | \ n | \ r)begin-base64 [ \ t] + [0-7]{3,4}[ \ t] +......这样的POSIX RE模式作为POSIX RE也比POSIX RE快2倍,但是不区分大小写的PCRE /^Received[ \ t]*:[ \ t]by[ \ t]+([^ \ t]+)[ \ t]/i比其POSIX RE版本快30倍!就大小写敏感性而言,PCRE目前似乎是最佳选择。但是我从ereg / eregi中发现了一些非常奇怪的行为。在一个非常简单的POSIX RE(^ | \ r | \ n)mime-version [ \ t] < / em>:我发现eregi()需要3.60秒(只

3

嗯,ereg及其衍生函数(例如ereg_match等)在php5中已被弃用,并将在php6中移除,因此最好使用preg系列函数。

preg用于Perl样式的正则表达式,而ereg是标准的POSIX正则表达式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接