【问题标题】:How to remove indentations or spaces from HTML comment tags?如何从 HTML 注释标签中删除缩进或空格?
【发布时间】:2024-01-23 02:04:01
【问题描述】:

这是我的代码:

$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 行前面的其他空格?

【问题讨论】:

  • 您只需要这样做一次,对吗?因此,即使这是一个低效的解决方案,也可以吗?
  • @Andreas 实际上我在我的模板引擎中使用了这个正则表达式,你的答案对于单行就足够了,但是整个模板文件可能无法完美运行.. 我对此有一个想法,我会的明天试试,谢谢你的回答!
  • 我会这样做like this
  • @carry0987 你的答案对于单行来说已经足够了,但是整个模板文件可能无法完美运行.. 请分享那些不起作用的案例,我会尝试改善答案。

标签: php html regex string preg-replace


【解决方案1】:

\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

【讨论】:

  • 另一个小问题,为什么`*`比\h*慢?他们采取相同的步骤(1376 步),但 \h* 使用 2ms,而 `*` 使用 3ms
  • 那么...您推荐使用什么? ` *` 或 \h* ?我不确定哪个更适合这种情况..
  • @carry0987: ` *` 匹配 0 个或多个单个空格,\h* 匹配 0 个或多个水平空格(即空格或制表符)
  • 非常感谢!我认为如果我只想清理水平空间,使用\h* 更好
【解决方案2】:

只要找到space comment,您就可以循环,然后使用 str_replace 将其删除。
循环完成后,只需删除 &lt;!-- 部分。

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}

【讨论】:

  • 这个答案的测试结果在模板引擎中可能需要超过 20 毫秒,在 PHP 7.0.1 中测试,而正则表达式的答案只需 3 毫秒即可获得相同的结果(真的很奇怪,str_replace 应该比正则表达式更快)
  • @carry0987 您是否考虑过 CPU 的加速和减速?当您进行速度比较时,您应该在开头和结尾包含“无意义”的代码,例如带有一些数学或其他东西的长循环。
  • 现在我知道了,我会用两个答案在整个项目中再次测试它
  • 我相信你是正确的,str_replace 更快,但请记住,正则表达式的答案是一个替换,我的循环直到没有更多的事情要做,这意味着它会做与缩进一样多的替换在最缩进的注释行中。
【解决方案3】:

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

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

然后替换为

{$1}

【讨论】:

    最近更新 更多