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

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

35 голосов
/ 19 марта 2011

У меня есть 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>

Ответы [ 13 ]

52 голосов
/ 19 марта 2011

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

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

10 голосов
/ 18 июня 2013

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

Ни одно из этих решений не было адаптировано для меня, поэтому я придумала следующее решение: Использование 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 голосов
/ 20 июня 2013

на всякий случай, если кому-то это нужно, Я придумал функцию из ответа @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(); ?>

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

4 голосов
/ 26 августа 2012
$html = preg_replace('~>\s*\n\s*<~', '><', $html);

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

<div class="wrap">
    <div>
    </div>
</div>
3 голосов
/ 19 марта 2011

Замена RegEx может помочь, что-то вроде:

$result = preg_replace('!\s+!smi', ' ', $content);
2 голосов
/ 11 декабря 2015

Поскольку пост gpupo предоставил самое чистое решение для многих различных типов форматирования интервалов. Тем не менее, небольшой, но важный кусок был забыт в конце! Окончательная обрезка строки: -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);
}
2 голосов
/ 07 января 2013

Функция array reduce:

$html = explode("\n", $html);
function trimArray($returner, $value) {
    $returner .= trim($value);
    return $returner;
}
echo $html = array_reduce($html, 'trimArray');
2 голосов
/ 17 мая 2012

Спасибо за размещение этого вопроса.Проблема действительно связана с ошибками пробелов в определенных средах.Хотя решение регулярных выражений работает в общем случае, для быстрого взлома удалите начальные пробелы и добавьте теги в конце каждой строки.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>

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

1 голос
/ 13 августа 2013
//...
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;
}
0 голосов
/ 29 июня 2018

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

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

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

...