我有一个匹配模板系统的正则表达式,不幸的是,它似乎在一些适度琐碎的查找中使 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>
我想这是一个长镜头。:(