Как удалить отступы или пробелы из тегов комментариев HTML? - PullRequest
2 голосов
/ 19 мая 2019

Вот мой код:

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

4 голосов
/ 19 мая 2019

\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
2 голосов
/ 19 мая 2019

Вы можете выполнить цикл до тех пор, пока найдете 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}
0 голосов
/ 19 мая 2019

Удалите \s* из начала вашего регулярного выражения.

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

затем замените на

{$1}
...