【发布时间】:2012-08-04 17:54:15
【问题描述】:
我有一个匹配模板系统的正则表达式,不幸的是,它似乎在一些适度琐碎的查找中使 apache(它在 Windows 上运行)崩溃。我已经研究了这个问题,并且有一些关于增加堆栈大小等的建议,但这些建议似乎都不起作用,而且我真的不喜欢通过增加限制来处理这些问题,因为它通常只是将 bug 推到了未来。
关于如何更改正则表达式以使其不太可能出错的任何想法?
我们的想法是捕捉最里面的块(在本例中为 {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,我曾经遇到过同样的问题,但修复方法相同!让我们看看这是否适用于 OP
-
另一个想法是转义正则表达式中的文字
{}字符可能会有所帮助。它们在技术上是元字符,虽然 PCRE 似乎对未转义的花括号相当宽容,但如果您正确地转义它们,它可能会减少工作量。另外为什么要使用命名的捕获组而不是在反向引用中使用名称?/block:\3=>/block:(?P=name)。这对于您的正则表达式尤其如此,因为<inverse>是可选的,在这种情况下<name>将是\2,而不是\3 -
你的意思是在 ~ism 部分的 s 标志?因为如果结束标签与没有 s 的开始标签在不同的行上,它就不起作用?不过后面的参考名称很好。
-
感谢大家迄今为止在这方面的帮助!