我有一个正则表达式用于匹配模板系统,但不幸的是,在某些相对简单的查找情况下,它似乎会导致 apache 崩溃(在 Windows 上运行)。我已经研究了这个问题,并有一些建议可以提高堆栈大小等,但似乎都没有效果,而且我不喜欢通过提高限制来处理这样的问题,因为这通常只会将错误推到未来。
无论如何,你们有什么想法来改变正则表达式,使其更不容易出错吗?
我的想法是捕获最内部的块(在这种情况下是{block:test}This should be caught first!{/block:test}
),然后将起始/结束标记替换掉,并通过正则表达式再次运行整个过程,直到没有剩余块为止。
正则表达式:
~(?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>
我猜这只是徒劳的希望。 :(
S
(大写!)标志解决了这个问题。我猜测这可能是一个未报告的内存泄漏或其他问题,而研究过程导致了它被避免。虽然可能性很小,但值得一试,我想说... - DaveRandom\{/?block:(\w+)\}
的模式(例如-但是带有更多组),并使用正则表达式进行词法分析而不是完整解析,那么你将会更容易。然后,您可以在代码中匹配适当的开始/结束标记,我认为这将更容易。这也可以使您摆脱迭代替换的需要-您将能够在单个扫描中完成它。只是一个想法。 - Kobi