如何从HTML注释标记中删除缩进或空格?

时间:2019-05-19 12:35:45

标签: php html regex string preg-replace

这是我的代码:

$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}

我的问题是,为什么不能只删除当前行开头的其他空间?

3 个答案:

答案 0 :(得分:4)

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

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

echo preg_replace('#\h*<!--({.+?})-->#', '$1', $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

答案 1 :(得分:2)

只要找到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}-->

返回:

{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}

答案 2 :(得分:0)

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

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

然后替换为

{$1}