Удалите все разрывы строк из источника html

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

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

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

Ответ 1

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

$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);

Ответ 2

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

// Before any output
ob_start();

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

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

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

Ответ 3

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

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

Ответ 4

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

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

Таким образом, $output не будет содержать никакого линейного перехода.

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

$output = preg_replace(array('/\r/', '/\n/'), '', $output);

Ответ 5

$output = preg_replace('!\s+!m', ' ', $output);

Ответ 6

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

  • Сначала извлеките весь текст в кавычки (вы не хотите прикасаться к ним), замените маркером порядковый номер, сохраните порядковый номер с текстом
  • Извлечь весь текст в тегах <script></script> и сделать то же, что и в шаге # 1
  • Заменить все пробелы (включая\n,\r) пробелами
  • Заменить все > 1 пространственные последовательности на 1 пробел
  • Замените все >_< на >< (_ = пробел)
  • Замените все _>, <_ и </_ на >, < и </ (_ = space)
  • Заменить маркеры на фактические тексты

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

Ответ 7

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

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

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

function MinifyHTML($str) {
    $protected_parts = array("<pre>,</pre>", "\"", "'");
    $extracted_values = array();
    $i = 0;

    foreach ($protected_parts as $part) {
        $finished = false;
        $search_offset = 0;
        $first_offset = 0;
        $startend = explode(",", $part);
        if (count($startend) == 1) { $startend[1] = $startend[0]; }

        while (!$finished) {
            $first_offset = strpos($str, $startend[0], $search_offset);
            if ($first_offset === false) { $finished = true; }
            else {
                $search_offset = strpos($str, $startend[1], $first_offset + strlen($startend[0]));
                $extracted_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((string)$i) + 3 - strlen($extracted_values[$i]);
                $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($extracted_values); $i >= 0; $i--) {
        $str = str_replace("$#".$i."$", $extracted_values[$i], $str);
    }

    return $str;
}

Ответ 8

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

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

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

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

function MinifyHTML($str) {
$protected_parts = array('<pre>,</pre>','<textarea>,</textarea>', '<,>');
$extracted_values = array();
$i = 0;
foreach ($protected_parts as $part) {
    $finished = false;
    $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 ($finished === false) {
        $first_offset = strpos($str, $startend[0], $search_offset);

        if ($first_offset === false) $finished = true;
        else {
            $search_offset = strpos($str, $startend[1], $first_offset + $len0);
            $extracted_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((string)$i) + 5 - strlen($extracted_values[$i]);
            ++$i;
        }
    }
}
$str = preg_replace("/\s/", " ", $str);
$str = preg_replace("/\s{2,}/", " ", $str);
$replace = array('> <'=>'><', ' >'=>'>','< '=>'<','</ '=>'</');
$str = str_replace(array_keys($replace), array_values($replace), $str);

for ($d = 0; $d < $i; ++$d)
    $str = str_replace('$$#'.$d.'$$', $extracted_values[$d], $str);

return $str;
}

Ответ 9

У вас не может быть <div> внутри <p> - это не специфицировано.

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

?><div><?php
    ?><div class="title">Hello</div><?php
?></div><?php