Удалить пробелы из HTML

У меня есть HTML-код как:

<div class="wrap">
    <div>
        <div id="hmenus">
            <div class="nav mainnavs">
                <ul>
                    <li><a id="nav-questions" href="/questions">Questions</a></li>
                    <li><a id="nav-tags" href="/tags">Tags</a></li>
                    <li><a id="nav-users" href="/users">Users</a></li>
                    <li><a id="nav-badges" href="/badges">Badges</a></li>
                    <li><a id="nav-unanswered" href="/unanswered">Unanswered</a></li>
                </ul>
            </div>
        </div>
    </div>
</div>

Как мне удалить пробелы между тегами с помощью PHP?

Мы должны получить:

<div class="wrap"><div><div id="hmenus"><div class="nav mainnavs"><ul><li><a id="nav-questions" href="/questions">Questions</a></li><li><a id="nav-tags" href="/tags">Tags</a></li><li><a id="nav-users" href="/users">Users</a></li><li><a id="nav-badges" href="/badges">Badges</a></li><li><a id="nav-unanswered" href="/unanswered">Unanswered</a></li></ul></div></div></div></div>

Ответ 1

Вам не нужно.

Сжатие GZip является особенностью всех современных веб-серверов и значительно превосходит любые "выигрыши", которые вы можете увидеть, используя это при доставке контента.

Не делай этого. Нет смысла. Это то, что было сделано для gzip.

Ответ 2

$html = preg_replace('~>\s+<~', '><', $html);

Но я не вижу смысла в этом. Если вы пытаетесь уменьшить размер данных, есть лучшие варианты.

Ответ 3

Прошло некоторое время с тех пор, как этот вопрос был впервые задан, но я все еще вижу необходимость опубликовать этот ответ, чтобы помочь людям с той же проблемой.

Ни одно из этих решений не было адаптировано для меня, поэтому я придумал это решение: использование output_buffer.

Функция ob_start принимает обратный вызов в качестве аргумента, который применяется ко всей строке перед ее выводом. Поэтому, если вы удалите пробелы из строки перед очисткой вывода, все готово.

/** 
 * Remove multiple spaces from the buffer.
 * 
 * @var string $buffer
 * @return string
 */
function removeWhitespace($buffer)
{
    return preg_replace('/\s+/', ' ', $buffer);
}

ob_start('removeWhitespace');

<!DOCTYPE html>
<html>
    <head></head>
    <body></body>
</html>

ob_get_flush();

Выше будет напечатано что-то вроде:

<!DOCTYPE html> <html> <head> </head> <body> </body> </html>

Надеюсь, это поможет.

КАК ИСПОЛЬЗОВАТЬ ЭТО В ООП

Если вы используете объектно-ориентированный код в PHP, вы можете использовать функцию обратного вызова, которая находится внутри объекта.

Если у вас есть класс, называемый, например, HTML, вы должны использовать эту строку кода

ob_start(["HTML","removeWhitespace"]); 

Ответ 4

$html = preg_replace('~>\s*\n\s*<~', '><', $html);

Я думаю, что это решение проблемы <b>Hello</b> <i>world</i>. Идея состоит в том, чтобы удалить пробелы только при наличии новой строки. Он будет работать для общего синтаксиса HTML, который:

<div class="wrap">
    <div>
    </div>
</div>

Ответ 5

на случай, если кому-то это понадобится, Я придумал функцию из ответа @Martin Angelova и @Savas Vedova и придумал

<?php 
   function rmspace($buffer){ 
        return preg_replace('~>\s*\n\s*<~', '><', $buffer); 
   };
?>
<?php ob_start("rmspace");  ?>
   //Content goes in here 
<?php ob_end_flush(); ?>

И это решило мою проблему. Примечание. Я не тестировал накладные расходы сервера, убедитесь, что вы проверили перед использованием в производстве

Ответ 6

Замена RegEx может сделать трюк, что-то вроде:

$result = preg_replace('!\s+!smi', ' ', $content);

Ответ 7

Спасибо за сообщение этого вопроса. Проблема в том, что проблема связана с ошибками в некоторых средах. Хотя решение регулярных выражений работает в общем случае, для быстрого взлома удаляет ведущие пробелы и добавляет теги в конец каждой строки. PHP удаляет новую строку после закрытия? > . Например:.

<ul><?php ?>
<li><a id="nav-questions" href="/questions">Questions</a></li><?php ?>
<li><a id="nav-tags" href="/tags">Tags</a></li><?php ?>
<li><a id="nav-users" href="/users">Users</a></li><?php ?>
<li><a id="nav-badges" href="/badges">Badges</a></li><?php ?>
<li><a id="nav-unanswered" href="/unanswered">Unanswered</a></li><?php ?>
</ul>

Очевидно, что это неоптимально по целому ряду причин, но оно будет работать для локализованной проблемы, не затрагивая всю цепочку инструментов.

Ответ 8

Функция array reduce:

$html = explode("\n", $html);
function trimArray($returner, $value) {
    $returner .= trim($value);
    return $returner;
}
echo $html = array_reduce($html, 'trimArray');

Ответ 9

Поскольку gpupo post предоставил самое чистое решение для разных типов форматирования интервалов. Однако в конце была забыта небольшая, но важная часть! Окончательная обрезка строки: -p

Ниже приведено тестовое и рабочее решение.

function compress_html($content)
{
    $i       = 0;
    $content = preg_replace('~>\s+<~', '><', $content);
    $content = preg_replace('/\s\s+/',  ' ', $content);

    while ($i < 5)
    {
        $content = str_replace('  ', ' ', $content);
        $i++;
    }

    return trim($content);
}

Ответ 10

//...
public function compressHtml($content)
{
    $content = preg_replace('~>\s+<~', '><', $content);
    $content = preg_replace('/\s\s+/', ' ', $content);
    $i = 0;
    while ($i < 5) {
        $content = str_replace('  ', ' ', $content);
        $i++;    
    }

    return $content;
}

Ответ 11

Используйте регулярные выражения, например:

>(\s).*?<

Ответ 12

<?php
    define(COMPRESSOR, 1);

        function remove_html_comments($content = '') {
            return preg_replace('/<!--(.|\s)*?-->/', '', $content);
        }
        function sanitize_output($buffer) {
            $search = array(
                '/\>[^\S ]+/s',  // strip whitespaces after tags, except space
            '/[^\S ]+\</s',  // strip whitespaces before tags, except space
            '/(\s)+/s'       // shorten multiple whitespace sequences
          );

          $replace = array(
             '>',
             '<',
             '\\1'
          );

          $buffer = preg_replace($search, $replace, $buffer);
          return remove_html_comments($buffer);
        }
        if(COMPRESSOR){ ob_start("sanitize_output"); }
    ?>

    <html>  
        <head>
          <!-- comment -->
          <title>Example   1</title>
        </head>
        <body>
           <p>This is       example</p>
        </body>
    </html>


    RESULT: <html><head><title>Example 1</title></head><body><p>This is example</p></body></html> 

Ответ 13

Я использовал это регулярное выражение для меня, и он работает как шарм:

preg_replace('/[ \t]+(?!="|\')/', '', $html);

Этот шаблон ищет пробелы и табуляцию (по крайней мере, один), за которыми не следует " или '. Это делается для того, чтобы избежать удаления пробелов между атрибутами html.