正则表达式顺序否定环视匹配问题

新手上路,请多包涵

我要匹配的内容是这个样子的:

{% foreach $data $key $value %}
233
{% endforeach %}
2333333
{% foreach $data $key $value %}
233
{% endforeach %}

要匹配第一个foreach里面的内容,写了一个介个样子的正则表达式

preg_match_all('/{%\s*foreach\s*(\$\S+)\s*(\$\S+)\s*(\$\S+)\s*%}((?!endforeach)[\s\S]*){%\s*endforeach\s*%}/i', $page, $match);

因为有两个foreach,所以我用了否定环视,也就是中间这一部分

[\s\S]*)

  • -匹配出来的结果跟没加(?!endforeach)的效果一样,刚开始学环视- - 求大牛指导
阅读 3.4k
1 个回答

你是要模仿实现模板引擎吗?
我觉得你想要的是将你要匹配的内容变换成这个样子:

<?php foreach( $data $key => $value): ?>
233
<?php endforeach; ?>

这样的话, 应该使用不到环视的, 解决起来也简单些.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题