PHP正则表达式递归匹配

Kwa*_*aak 0 php regex nested

我正在尝试匹配模板文件中的某组标签.然而,我希望标签能够嵌套在自身中.

我的正则表达式如下:(带/ s)

<!-- START (.*?) -->(.*?)<!-- END \\1 -->
Run Code Online (Sandbox Code Playgroud)

标签示例:

<!-- START yList -->
  y:{yList:NUM} | 
  <!-- START xList -->
    x:{xList:NUM} 
  <!-- END xList -->
  <!-- CARET xList -->
  <br>
<!-- END yList -->
<!-- CARET yList -->
Run Code Online (Sandbox Code Playgroud)

现在匹配结果将是:

匹配0:

组(0)(全场比赛)

<!-- START yList --> 
 y 
 <!-- START xList --> 
   x 
 <!-- END xList --> 
 <!-- CARET xList --> 
 <br> 
<!-- END yList -->
Run Code Online (Sandbox Code Playgroud)

基团(1)

yList
Run Code Online (Sandbox Code Playgroud)

组(2)

y 
<!-- START xList --> 
  x 
<!-- END xList --> 
<!-- CARET xList --> 
<br>
Run Code Online (Sandbox Code Playgroud)

我希望2匹配而不是1匹配,嵌套标签集不匹配.这有可能与正则表达式,或者我应该保持regexing组(2)结果,直到我没有找到新的匹配?

Fra*_*rth 5

正则表达式不适合解析任意深度的树结构.根据你正在使用的正则表达式的风格,可能会这样做,但不推荐 - 它们很难阅读,也很难调试.

我建议改为编写一个简单的解析器.你所做的是将你的文本分解为一组可能的标记,每个标记都可以由简单的正则表达式定义,例如:

START_TOKEN = "<!-- START [A-Za-z] -->"
END_TOKEN = ...
HTML_TEXT = ...
Run Code Online (Sandbox Code Playgroud)

迭代你的字符串,只要你匹配这些标记,将它们从字符串中拉出来,并将它们存储在一个单独的列表中.执行此操作时,请务必保存令牌内的文本(如果有).

然后,您可以迭代令牌列表,并根据令牌类型创建节点的嵌套树结构,每个节点包含1)原始令牌的文本,以及2)子节点列表.

如果这看起来太复杂,您可能需要查看一些解析器教程.