我在PHP正则表达式库注意到有额日格和预浸之间做出选择。 有什么不同? 是一个比其他的更快,如果是这样,为什么不是一个过时的慢?
有没有地方,最好是使用一个比其他任何情况呢?
我在PHP正则表达式库注意到有额日格和预浸之间做出选择。 有什么不同? 是一个比其他的更快,如果是这样,为什么不是一个过时的慢?
有没有地方,最好是使用一个比其他任何情况呢?
参观php.net/ereg显示以下内容:
警告
此功能已被弃用的PHP 5.3.0和去除PHP 6.0.0的。 依靠这个功能非常灰心。
顺着页面只是有点进一步,我们这样说的:
注意:的preg_match(),它使用了Perl兼容的正则表达式语法, 通常更快的替代EREG()。
请注意我的重点。
预浸料是Perl兼容的正则表达式库
额日格是POSIX complient正则表达式库
他们有一个稍微不同势语法和预浸料是在某些情况下稍快。 额日格已被弃用(和它在PHP6删除),所以我不会推荐它被使用。
有很多讨论哪些是更快,更好。
如果你打算哪天推进到PHP6您作出决定。 除此以外:
普遍的共识是,PCRE是各地解决越好,但如果你有大量的流量的特定页面,而你不需要PHP6它可能是值得一些测试。 例如,从PHP手册评论:
自嘲POSIX正则表达式在PHP Perl的搜索等取代木板和砖与预制房间和墙壁的房子。 当然,你可以混合和匹配一些零件,但它是一个更容易在你眼前了所有作品进行修改。
PCRE比POSIX RE快? 不总是。 在这里Cynergi最近的搜索引擎项目,我有几个可爱的ereg_replace()函数,花了3分钟来处理数据的简单循环。 我改变了10线环成100行手写代码进行更换和循环现在拿了10秒来处理相同的数据! 这打开了我的眼睛什么可以在某些情况下是非常慢的正则表达式。 最近我决定看看Perl兼容的正则表达式(PCRE)。 大多数的网页要求PCRE比POSIX快,但在其他一些要求。 我决定在我自己的bechmarks。 我的第几个试验证实PCRE要快一些,但是...结果是比其他人都拿到略有不同,所以我决定把基准RE使用的每一个情况下,我对8000线安全(和快速)Webmail的项目在这里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(即使使用\ d和\ d和非贪婪匹配快30% )。 在另一方面,类似PCRE复杂图案/ [0-9] {1,2} [\吨] + [A-ZA-Z] {3} [\吨] + [0-9] {4} [ \吨] + [0-9] {1,2}:[0-9] {1,2}(:[0-9] {1,2})[\吨] + [+ - ] [0? -9] {4} / 2.5倍是更快PCRE比POSIX RE。 简单替换模式像ereg_replace( “[^ A-ZA-Z0-9 - ] +”, “”,$米); 在POSIX RE比PCRE的2倍速度更快。 然后我们感到困惑,又因为POSIX RE格式,如:(^ | \ n | \ r)的开始-的base64 [\ t] + [0-7] {3,4} [\ t] + ......为2x更快POSIX RE,但是不区分大小写PCRE / ^收到[\吨] *:[\吨] 由[\吨] +([^ \吨] +)[\吨] / i大于30倍快其POSIX RE版! 当涉及到区分大小写,PCRE迄今似乎是最好的选择。 但我发现,从额日格/ eregi一些很奇怪的行为。 一个非常简单的POSIX RE(^ | \ r | \ n)的MIME版本[\ t]:我发现eregi()以(在测试基准只是一个数字)3.60s,而相应的PCRE了0.16s! 但是,如果我使用额日格()(区分大小写)在POSIX RE时间的推移下降到0.08s! 所以,我进一步调查。 我试图让POSIX RE不区分大小写本身。 我得到尽可能的:(^ | \ r | \ n)的[MM] [II] [MM] [EE] -vers [II] [OO] [NN] [\ t] *:这个版本还拿了0.08秒。 但是,如果我尝试同样的规则适用于任何的“V”,“E”,“R”或“S”未改变字母,时间回到3.60s标志,而不是逐渐的,但immediatelly所以! 测试数据并没有在它或任何“离子”可能被混淆了POSIX解析器任何简称“VER”,其他的“哑剧”的话,所以我无所适从。 底线:总是基准你PCRE / POSIX RE找到最快的! 测试是在Windows下用PHP 5.1.2进行,在命令行。 佩德罗·弗莱雷cynergi.com
即使额日格在PHP 5.3过时,在mb_ereg *功能都没有。 我相信这样做的主要原因是因为PHP6正在重建所有MB / Unicode支持,因此旧的“常规”额日格方法是没用的,因为mb_ereg将以更新/更好。
我知道这并不回答关于速度的问题,但它允许你继续使用POSIX和PCRE。
那么,额日格和其衍生功能(ereg_match等)已被弃用在PHP5和PHP6被删除,所以你可能是最好用预浸家人去代替。
预浸料是Perl样式的正则表达式,而额日格是标准的POSIX正则表达式。