Удалить все разрывы строк из источника HTML - PullRequest
39 голосов
/ 10 марта 2011

Ну, я знаю, что запутывание - плохая идея.Но я хочу, чтобы весь мой HTML-код входил в одну длинную строку.Все HTML-теги генерируются через PHP, поэтому я думаю, что это возможно.Я знал замену \n\r из регулярного выражения, но понятия не имею, как это сделать.В случае, если мне неясно, вот пример

$output = '<p>
              <div class="title">Hello</div>
           </p>';
echo $output;

Для просмотра в средстве просмотра исходного кода как <p><div class="title">Hello</div></p>

Ответы [ 9 ]

46 голосов
/ 10 марта 2011

Может быть, это?

$output = str_replace(array("\r\n", "\r"), "\n", $output);
$lines = explode("\n", $output);
$new_lines = array();

foreach ($lines as $i => $line) {
    if(!empty($line))
        $new_lines[] = trim($line);
}
echo implode($new_lines);
34 голосов
/ 10 марта 2011

Вы можете попробовать это, возможно.

// Before any output
ob_start();

// End of file
$output = ob_get_clean();
echo preg_replace('/^\s+|\n|\r|\s+$/m', '', $output);

Это должно, если я не испортил регулярное выражение, перехватил все выходные данные, а затем заменил все символы новой строки, а также все пробелы в конце и началеlines.

Если у вас уже есть все выходные данные, собранные в переменной, вы, конечно, можете просто использовать последнюю строку напрямую и пропустить материал буферизации вывода:)

14 голосов
/ 29 сентября 2012

работал для меня:

$output = str_replace(array("\r\n", "\r", "\n"), "", $output);
5 голосов
/ 10 марта 2011

Вы можете сделать:

$output = '<p>'.
              '<div class="title">Hello</div>'.
           '</p>';

Таким образом, $output не будет содержать скачка строки.

Это также должно работать:

$output = preg_replace(array('/\r/', '/\n/'), '', $output);
3 голосов
/ 26 сентября 2012
$output = preg_replace('!\s+!m', ' ', $output);
1 голос
/ 11 марта 2011

Это уже хороший ответ, но вы можете сделать больше, чем просто обрезать пробелы на обоих концах каждой строки:

  1. Сначала извлеките весь текст в кавычках (их не нужно трогать), замените маркер с порядковым номером, сохраните порядковый номер с текстом
  2. Извлеките весь текст из тегов <script></script> и сделайте то же самое, что и шаг # 1
  3. Заменить все пробелы (включая \ n, \ r) пробелами
  4. Заменить все> 1 пробел последовательности на 1 пробел
  5. Заменить все >_< на >< (_ = пробел)
  6. Заменить все _>, <_ и </_ на >, < и </ (_ = пробел)
  7. Заменить маркеры актуальными текстами

Эта процедура потенциально может сжать весь HTML-файл. При этом используется тот факт, что несколько пробелов внутри HTML-тегов интерпретируются как один пробел.

0 голосов
/ 16 августа 2013

Вы не можете иметь <div> внутри <p> - это не является спецификацией.

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

?><div><?php
    ?><div class="title">Hello</div><?php
?></div><?php
0 голосов
/ 21 марта 2012

Это улучшенная функция выше. Он добавляет защиту текстовой области, а также все, что является тегом, остается неизменным.

Я также удалил strlen в цикле (его статика).

Это может работать быстрее в качестве однопроходного фильтра для проверки любой из защищенных частей. Для такого маленького массива protected_parts это будет более эффективным, чем циклическое повторение $str в четыре раза.

Также это не исправляет: class = "" (лишние пробелы между = и ") как его содержимое внутри тегов.

<code>function MinifyHTML($str) {
$protected_parts = array('<pre>,
',' ',' <,> '); $ extract_values ​​= array (); $ i = 0; foreach ($ protected_parts как $ part) { $ закончено = ложь; $ search_offset = $ first_offset = 0; $ end_offset = 1; $ startend = explode (',', $ part); if (count ($ startend) === 1) $ startend [1] = $ startend [0]; $ len0 = strlen ($ startend [0]); $ len1 = strlen ($ startend [1]); while ($ done === false) { $ first_offset = strpos ($ str, $ startend [0], $ search_offset); if ($ first_offset === false) $ закончено = верно; еще { $ search_offset = strpos ($ str, $ startend [1], $ first_offset + $ len0); $ extract_values ​​[$ i] = substr ($ str, $ first_offset + $ len0, $ search_offset - $ first_offset - $ len0); $ str = substr ($ str, 0, $ first_offset + $ len0). '$$ #'. $ i. '$$'. substr ($ str, $ search_offset); $ search_offset + = $ len1 + strlen ((строка) $ i) + 5 - strlen ($ extract_values ​​[$ i]); ++ $ я; } } } $ str = preg_replace ("/ \ s /", "", $ str); $ str = preg_replace ("/ \ s {2,} /", "", $ str); $ replace = array ('> <' => '> <', '>' => '>', '<' => '<', '</' => '
0 голосов
/ 08 мая 2011

Это (насколько я проверял) рабочая реализация инструкций Стивена Чанга. Я не совсем убежден номером пять, но все равно включил его.

Поместите вещи, которые вы хотите защитить, в массив protected_parts. Делайте это для того, чтобы вы их защищали Если начальный и конечный биты разные (как в HTML-тегах), разделите их запятыми.

Кроме того, я понятия не имею, является ли это наиболее оптимизированным способом сделать это, но он работает для меня и кажется достаточно быстрым. Не стесняйтесь улучшать и т.д. (Дайте мне знать, если вы тоже!)

<code>function MinifyHTML($str) {
    $protected_parts = array("<pre>,
"," \ "", "'"); $ extract_values ​​= array (); $ i = 0; foreach ($ protected_parts как $ part) { $ закончено = ложь; $ search_offset = 0; $ first_offset = 0; $ startend = explode (",", $ part); if (count ($ startend) == 1) {$ startend [1] = $ startend [0]; } пока (! $ закончено) { $ first_offset = strpos ($ str, $ startend [0], $ search_offset); if ($ first_offset === false) {$ закончено = верно; } еще { $ search_offset = strpos ($ str, $ startend [1], $ first_offset + strlen ($ startend [0])); $ extract_values ​​[$ i] = substr ($ str, $ first_offset + strlen ($ startend [0]), $ search_offset - $ first_offset - strlen ($ startend [0])); $ str = substr ($ str, 0, $ first_offset + strlen ($ startend [0])). "$ #". $ i. "$". substr ($ str, $ search_offset); $ search_offset + = strlen ($ startend [1]) + strlen ((строка) $ i) + 3 - strlen ($ extract_values ​​[$ i]); $ Я ++; } } } $ str = preg_replace ("/ \ s /", "", $ str); $ str = preg_replace ("/ \ s {2,} /", "", $ str); $ str = str_replace ("> <", "> <", $ str); $ str = str_replace (">", ">", $ str); $ str = str_replace ("<", "<", $ str); $ str = str_replace ("</", "</", $ str); for ($ i = count ($ extract_values); $ i> = 0; $ i--) { $ str = str_replace ("$ #". $ i. "$", $ extract_values ​​[$ i], $ str); } вернуть $ str; }
...