用于匹配 Liquid 模板中的标签的正则表达式:html 标签内的“>”

Regex for matching a tag in a Liquid template : ">" inside html tag

我必须在 Liquid 模板中为 body 标签编写匹配模式。

虽然匹配 HTML 标签非常简单,但我遇到的问题是 HTML 特殊字符可以在 Liquid 代码中使用。 示例:

<body class="template-{{ template | replace: '.', ' ' | truncatewords: 
1, '' }}{% if promo %}has-promo{% endif %} {% if products.size > 1 
%}has-related-products{% endif %} {% if settings.product-hover == 
'quick-shop' %}has-quick-shop{% endif %} loading" >

或简化:

<body {% bla > 1 %} bla bla>

我当前的匹配模式 /<body(.[^>]*)>/s 匹配上面的代码,直到第一个 >。我需要一个匹配整个标签的模式。

试试:

/<body(.[^>{}]*(?:{+[^}]*}+[^>{}]*)*)>/s

See demo

而不是 [^>]* 正则表达式使用 [^>{}]*(?:{+[^}]*}+[^>{}]*)*,匹配除 >{} 之外的任何字符;在某些时候它可以遇到 {,因此它匹配 {+something}+ 的全部内容,然后再次匹配 [^>{}]*。这个技巧在最后一个 *.

中重复了很多次