Intereting Posts
Загрузка файлов в Zoho API с помощью PHP Curl Режим отображения документа Word, сгенерированного в PHP Ошибка MS SQL Conversion не удалось при преобразовании значения varchar в тип данных int и JOIN two Tables используя автозаполнение jquery-ui с несколькими полями ввода CryptoJS шифрует AES с парольной фразой, но для расшифровки PHP требуется ключ сбой php getaddrinfo: «При поиске базы данных произошла ошибка, не подлежащая восстановлению». почему не отображаются данные приложенной строки после отправки? Многоязыковая интеграция Как просмотреть значение длинных строк с помощью NetBeans и x-debug? Получение идентификатора твита определенного твита максимальная длина URI для file_get_contents () Сравнение PHP __get () с __get __ () и __getattr __ () в Python Создание php-файла с контентом из терминала Задание переменной sessionigniter с переменной не работает как предотвратить SQL-инъекцию из этого запроса?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 $output = preg_replace(array('/\r/', '/\n/'), '', $output); 
 $output = preg_replace('!\s+!m', ' ', $output); 

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

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

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

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

Поместите вещи, которые вы хотите защитить, в массиве 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; } 

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

Я также удалил 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; } 

Вы не можете иметь <div> внутри <p> – он не является spec-valid.

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

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