Удалить пробелы из 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.