我有一个匹配模板系统的正则表达式,不幸的是它似乎在一些微不足道的查找中崩溃了apache(它运行在Windows上)。我研究了这个问题,并且提出了一些提升堆栈大小等方面的建议,但其中没有一项似乎有效,我也不喜欢通过增加限制来处理这些问题,因为它通常只是将错误推向未来。PHP正则表达式崩溃apache
无论如何任何想法如何改变正则表达式使其不太可能犯错?
这个想法是捕捉最内层的块(在这种情况下为{block:test}This should be caught first!{/block:test}
),然后我将str_replace放开始/结束标记,并通过正则表达式重新运行整个事物,直到没有剩下的块为止。
正则表达式:
~(?P<opening>{(?P<inverse>[!])?block:(?P<name>[a-z0-9\s_-]+)})(?P<contents>(?:(?!{/?block:[0-9a-z-_]+}).)*)(?P<closing>{/block:\3})~ism
样本模板:
<div class="f_sponsors s_banners">
<div class="s_previous">«</div>
<div class="s_sponsors">
<ul>
{block:sponsors}
<li>
<a href="{var:url}" target="_blank">
<img src="image/160x126/{var:image}" alt="{var:name}" title="{var:name}" />
</a>
{block:test}This should be caught first!{/block:test}
</li>
{/block:sponsors}
</ul>
</div>
<div class="s_next">»</div>
</div>
这是一个长镜头,我想。 :(
奇怪的,因为它的声音,我曾经有一个正则表达式是保持吃一个特定的Apache实例和'S'(*大写!*)标志修复它。我猜想这是一个未报告的内存泄漏或什么,研究过程导致它被避免。远射,但值得一试,我会说... – DaveRandom 2012-08-07 17:03:19
@DaveRandom,我有同样的问题一次,具有相同的修复!让我们看看它是否适用于OP – 2012-08-07 17:05:37
另一个想法是,转义正则表达式中的字符“{}”字符可能会有所帮助。它们在技术上是元字符,而PCRE似乎对宽大的花括号非常宽容,如果你正确地将它们转义出来,可能会减少它的工作量。另外为什么使用命名的捕获组并且不在后向引用中使用名称? '/ block:\ 3' =>'/ block :(?P = name)'。这对你的正则表达式尤其如此''是可选的,在这种情况下''将是'\ 2',而不是'\ 3' –
DaveRandom
2012-08-07 17:07:00