PCRE正则表达式具有指数运行时间

时间:2012-04-14 17:57:11

标签: php regex pcre

使用递归回溯的正则表达式实现在某些情况下可能会呈现指数运行时间。

我正试图为PCRE引擎找到这样一个病态的正则表达式。

我已经尝试了几个正则表达式,已知它们是Perl正则表达式的指数(例如this one),但在我的测试中它们都没有表现出PCRE的指数运行时。

1 个答案:

答案 0 :(得分:3)

在你的测试中,所有的正则表达式都会失败吗?当他们确实失败了,你有没找到原因?可能匹配失败因为正则表达式引擎检测到过多的回溯。我不知道这是否会发生,但尝试一个应该成功的正则表达式,就像这个:

(?i)lorem(?:.|\s)*pri\.

使用RegexBuddy,我将该正则表达式应用于下面文本的第一段,并按预期突出显示整个段落。当我删除段落末尾的句号时,突出显示已经消失,调试器表示它已经在一百万次操作后放弃了。这并不奇怪,但是当我把时间段放回去并加上第二段时,它仍然失败了 - 再次回溯太多了。


  

Lorem ipsum tritani妨碍civibus ei pri,legimus antiopam no sed,quo id everti forensibus maiestatis。 Vim ad intellegat consequuntur。 Te dicam妨碍inciderint mea。 Usu提示不要争辩,不要说非常精彩的pri。

     

Ne utroque nominavi moderatius qui,ius at suas velit nihil,vidit blandit facilisi pri ut。 Ad vel offendit reprehendunt,mea ex quem ipsum complectitur。 Veri cetero feugait cu usu,在dolor corpora adolescens vim,at sitting voluptua placerat sadipscing。 Minim admodum constituam eos ut,vix ut movet causae tractatos,in pro dicat dicta dolores。推动了eum no。