PHP preg match - 获取所有有效的组标签

PHP preg match - get all valid group tags

提问人:Tikboy 提问时间:6/20/2023 最后编辑:M--Tikboy 更新时间:7/1/2023 访问量:91

问:

例如,我有这个字符串:

{% if test %}
   random text here
   {% case item %}{% when "hello" %}hi{% else %}goodbye{% endcase %}
   {% if hello %}text here{% else %}new text{% endif %}
random text here
{% endif %}
{% case item %}{% when "hello" %}hi{% else %}goodbye{% endcase %}

然后用“preg_match_all”,我会得到这个结果:

[0] => "{% if test %}random text here{% case item %}{% when "hello" %}hi{% else %}goodbye{% endcase %}{% if hello %}text here{% else %}new text{% endif %}random text here{% endif %}"
[1] => "{% case item %}{% when "hello" %}hi{% else %}goodbye{% endcase %}"

基本上,我只想获取一组标签。我在正则表达式中尝试了不同的组合,但我不能选择正确的组合。

PHP 正则表达式 字符串 解析

评论

3赞 shingo 6/20/2023
不要使用正则表达式来解析 html,请使用 xml 扩展名
0赞 Tikboy 6/20/2023
明白了。请允许我更改问题,因为我也将在不同的场景中使用它。
0赞 shingo 6/20/2023
让我说得更清楚。如果你想解析标记语言,不要考虑使用正则表达式,写一个解析器。您可以在第一个链接中查看其他答案,它们应该告诉您为什么不这样做。除非您要解析的字符串非常具体,例如可以解决您的问题,但我认为这不是您需要的解决方案。"/{% div %}.*{% enddiv %}|{% span %}.*{% endspan %}/"

答:

-2赞 Hao Wu 6/20/2023 #1

如果你使用的是PHP,你可以尝试使用递归的正则表达式:(?R)

\{%\s*(\w+)\b(?:(?!%}).)*%}(?:(?!\{%)[\s\S]|(?R))*?{%\s*end\1\s*%}

它确保它只捕获最外层的、平衡的和封闭的标记,下面是测试用例: https://regex101.com/r/3JbMQC/1