如何从 HTML 评论标签中删除缩进或空格?

How to remove indentations or spaces from HTML comment tags?

这是我的代码:

$template = preg_replace("\s*/\<\!\-\-\{(.+?)\}\-\-\>/s", "{\1}", $template);

以及我要删除评论缩进的 html

    <!--{hello}-->
    <div class="novalue">
        <a>URL</a>
    </div>
    <!--{/hello}-->

我希望它是这样的:

{hello}
    <div class="novalue">
        <a>URL</a>
    </div>
{/hello}

但是,结果是:

{hello}
        <div class="novalue">
            <a></a>
        </div>{/hello}

我的问题是,为什么它不能删除 current 行前面的其他 space?

从正则表达式的开头删除 \s*

/\<\!\-\-\{(.+?)\}\-\-\>/s

然后替换为

{}

只要找到一个space comment就可以循环,然后用str_replace去掉。
循环完成后,只需删除 <!-- 部分。

while(strpos($str, ' <!--{hello}-->') !== false){
    $str = str_replace(" <!--{hello}-->", "<!--{hello}-->",$str);
    $str = str_replace(" <!--{/hello}-->", "<!--{/hello}-->",$str);
}
$str = str_replace(["<!--{hello}-->", "<!--{/hello}-->"], ["{hello}", "{/hello}"],$str);


echo $str;

https://3v4l.org/9oGWu

示例输入:

    <!--{hello}-->
    <div class="novalue">
        <a>URL</a>
    </div>
    <!--{/hello}-->

        <!--{hello}-->
        <div class="novalue">
            <a>URL</a>
        </div>
        <!--{/hello}-->

<!--{hello}-->
<div class="novalue">
    <a>URL</a>
</div>
<!--{/hello}-->

Returns:

{hello}
    <div class="novalue">
        <a>URL</a>
    </div>
{/hello}

{hello}
        <div class="novalue">
            <a>URL</a>
        </div>
{/hello}

{hello}
<div class="novalue">
    <a>URL</a>
</div>
{/hello}

\s 包括换行符,您想使用 \h 代替水平空格并且不要转义正则表达式中的所有字符,它变得不可读:

$html = <<<EOD
    <!--{hello}-->
    <div class="novalue">
        <a>URL</a>
    </div>
    <!--{/hello}-->
EOD;

echo preg_replace('#\h*<!--({.+?})-->#', '', $html);

输出:

{hello}
    <div class="novalue">
        <a>URL</a>
    </div>
{/hello}

解释:

#           # regex delimiter
  \h*       # 0 or more horizontal spaces
  <!--      # literally, begin comment
  (         # start group 1
    {       # opening curly brace
    .+?     # 1 or more any character, not greedy
    }       # closing curly brace
  )         # end group 1
  -->       # literally, end comment
#           # regex delimiter