PHP ereg与preg

Eve*_*oob 38 php regex pcre posix-ere

我注意到在PHP正则表达式库中有ereg和preg之间的选择.有什么不同?是一个比另一个更快,如果是这样,为什么不慢的被弃用?

是否有任何情况下使用一个而不是另一个?

Sam*_*son 42

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

警告

自PHP 5.3.0开始,此函数已被弃用,自PHP 6.0.0起已被删除.非常不鼓励依赖此功能.

在页面下方稍微进一步了解我们:

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

请注意我的重点.

  • 正如Percy指出的那样,`mb_ereg_match()`和其他多字节*ereg*函数不会被弃用. (5认同)

Yac*_*oby 19

preg是Perl兼容的Regex库,
ereg是POSIX complient regex库

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


Sam*_*ody 5

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

如果您计划在某天升级到PHP6,则可以做出决定。除此以外:

普遍的共识是,PCRE在所有解决方案中都是更好的解决方案,但是如果您的特定页面上有很多流量,并且您不需要PHP6,那么可能值得进行一些测试。例如,从PHP手册注释:

用PHP取代POSIX正则表达式进行Perl搜索,就像用木板和砖代替带有预制房间和墙壁的房屋一样。当然,您可以混合和匹配某些部分,但是将所有部分摆在您面前,修改起来要容易得多。

PCRE比POSIX RE快吗?不总是。在Cynergi的最近一个搜索引擎项目中,我有一个简单的循环,其中包含一些可爱的ereg_replace()函数,该函数花了3分钟来处理数据。我将10行循环更改为100行手写代码进行替换,现在循环用10秒钟来处理相同的数据!在某些情况下,这让我大开眼界正则表达式非常慢。最近,我决定研究Perl兼容的正则表达式(PCRE)。大多数页面声称PCRE比POSIX快,但另一些声称。我决定自己做个基准。我的前几次测试确认PCRE速度更快,但是...结果与其他结果略有不同,因此我决定在8000行安全(快速)Webmail项目中对我使用的每种RE使用情况进行基准测试,网址为: Cynergi签出。结果?没有定论!有时PCRE 更快(有时快100倍以上!),而另一些时候POSIX RE更快(快2倍)。我仍然必须找到关于何时彼此更快的规则。它不仅是关于搜索的数据大小,匹配的数据量,或“重新编译时间”,当你经常重复的功能,这将表明:一个会永远比其他更快。但是我没有在这里找到模式。但是说实话,我也没有花时间研究源代码并分析问题。我可以举几个例子。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} /在PCRE中的速度是POSIX RE中的2.5倍。简单的替换模式,例如ereg_replace(“ [^ a-zA-Z0-9-] +”,“”,$ m); 在POSIX RE中比PCRE快2倍。by [\ t] +([[^ \ t] +)[\ t] / i比POSIX RE版本快30倍!在区分大小写方面,迄今为止,PCRE似乎是最好的选择。但是我从ereg / eregi中发现了一些非常奇怪的行为。在非常简单的POSIX RE(^ | \ r | \ n)mime-version [\ t]上:我发现eregi()花费了3.60s(在测试基准中只是一个数字),而相应的PCRE花费了0.16s!但是,如果我使用ereg()(区分大小写),则POSIX RE时间将降至0.08s!所以我进一步调查。我试图使POSIX RE不区分大小写。我得到的是:(^ | \ r | \ n)[mM] [iI] [mM] [eE] -vers [iI] [oO] [nN] [\ t] *:此版本也使用了0.08 s。但是,如果我尝试对未更改的'v','e','r'或's'字母中的任何一个应用相同的规则,那么时间回到了3.60s标记,并且不是逐渐地,而是立即地所以!测试数据中没有任何“ vers”,其他“ mime”词或任何可能使POSIX解析器混乱的“ ion”,所以我很茫然。底线:始终对您的PCRE / POSIX RE进行基准测试,以找到最快的!在Windows下从命令行使用PHP 5.1.2进行了测试。Pedro Freire cynergi.com


Per*_*rcy 5

尽管 ereg 在 PHP 5.3 中已被弃用,但 mb_ereg* 函数却没有。我相信主要原因是 PHP6 正在重建所有 MB/Unicode 支持,因此旧的“常规”ereg 方法毫无用处,因为 mb_ereg 将更新/更好。

我知道它没有回答有关速度的问题,但它确实允许您继续使用 POSIX 和 PCRE。