У меня есть 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>
Вам не нужно.
Сжатие GZip является особенностью всех современных веб-серверов и значительно превосходит любые «выигрыши», которые вы можете увидеть, используя это при доставке контента.
Не делай этого. Нет никакого смысла. Для этого и был сделан gzip.
$html = preg_replace('~>\s+<~', '><', $html);
Но я не вижу смысла в этом. Если вы пытаетесь уменьшить размер данных, есть лучшие варианты.
Прошло некоторое время с тех пор, как этот вопрос был впервые задан, но я все еще вижу необходимость опубликовать этот ответ, чтобы помочь людям с той же проблемой.
Ни одно из этих решений не было принято для меня, поэтому я придумал это решение: Использование 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>
Надеюсь, это поможет.
$html = preg_replace('~>\s*\n\s*<~', '><', $html);
Я думаю, что это решение проблемы <b>Hello</b> <i>world</i>
. Идея состоит в том, чтобы удалить пробелы только тогда, когда есть новая строка. Он будет работать для общего синтаксиса HTML, который:
<div class="wrap"> <div> </div> </div>
на случай, если кому-то это понадобится, я придумал функцию от ответа @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(); ?>
И это решило мою проблему. Примечание. Я не тестировал накладные расходы сервера, убедитесь, что вы проверили перед использованием в производстве
Замена RegEx может сделать трюк, что-то вроде:
$result = preg_replace('!\s+!smi', ' ', $content);
Спасибо, что опубликовали этот вопрос. Проблема в том, что проблема связана с ошибками в некоторых средах. Хотя решение регулярных выражений работает в общем случае, для быстрого взлома удаляет ведущие пробелы и добавляет теги в конец каждой строки. 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>
Очевидно, что это неоптимально по целому ряду причин, но оно будет работать для локализованной проблемы, не затрагивая всю цепочку инструментов.
Функция array reduce
:
$html = explode("\n", $html); function trimArray($returner, $value) { $returner .= trim($value); return $returner; } echo $html = array_reduce($html, 'trimArray');
Как сообщение 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); }
Используйте регулярные выражения, например:
>(\s).*?<
//... 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; }
<?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>