Преобразование HTML кода в одну строку. Безопасно уменьшает размер кода за счет пробелов между тегами и переводов на новую строку и ускоряет загрузку сайта/страницы.
Вариант 1:
<?php $text=' <!DOCTYPE>
<html>
<head>
<title>HTML код в одну строку</title>
</head>
<body>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. <br />
Etiam dictum euismod laoreet. <br />
Proin sed turpis eu eros imperdiet condimentum at nec sem. <br />
Cras fermentum rutrum fermentum. <br />
In facilisis scelerisque accumsan. <br />
In vitae justo ut mi tincidunt volutpat vel vitae nibh. <br />
Vestibulum sem orci, accumsan quis gravida et, porttitor nec nisl. <br />
Praesent erat risus, gravida nec volutpat vitae, venenatis eu libero. <br />
Vestibulum lacinia justo at augue cursus tristique. <br />
Proin enim elit, porta venenatis vehicula vel, ornare ut eros. <br />
Etiam adipiscing tincidunt viverra.<br />
Aliquam et nibh justo. <br />
Quisque ut nulla nunc, a vehicula orci.<br />
Nullam eu odio velit, eu molestie odio. <br />
Sed at justo quis massa dictum egestas.<br />
</p>
<!--//-->
<script type="text/javascript">document.write(\'<h1>Hello, World!</h1>\');</script>
<!--//-->
</body>
</html>
';
$s=str_replace("\r\n"," ",$text);
echo preg_replace("/((?<=>)|(?<=--)|(?<=.))[\s\n\r\t]+((?=--)|(?=<))/U",'',$s);?>
Повтор \r\n
в str_replace
и preg_replace
намеренный – так весь исходный код в одну строку (вместе с <br />
).
Или без str_replace
– так в одну строку только теги (кроме <br />
):
<?php $text=' <!DOCTYPE>
<html>
<head>
<title>HTML код в одну строку</title>
</head>
<body>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. <br />
Etiam dictum euismod laoreet. <br />
Proin sed turpis eu eros imperdiet condimentum at nec sem. <br />
Cras fermentum rutrum fermentum. <br />
In facilisis scelerisque accumsan. <br />
In vitae justo ut mi tincidunt volutpat vel vitae nibh. <br />
Vestibulum sem orci, accumsan quis gravida et, porttitor nec nisl. <br />
Praesent erat risus, gravida nec volutpat vitae, venenatis eu libero. <br />
Vestibulum lacinia justo at augue cursus tristique. <br />
Proin enim elit, porta venenatis vehicula vel, ornare ut eros. <br />
Etiam adipiscing tincidunt viverra.<br />
Aliquam et nibh justo. <br />
Quisque ut nulla nunc, a vehicula orci.<br />
Nullam eu odio velit, eu molestie odio. <br />
Sed at justo quis massa dictum egestas.<br />
</p>
<!--//-->
<script type="text/javascript">document.write(\'<h1>Hello, World!</h1>\');</script>
<!--//-->
</body>
</html>
';
echo preg_replace("/((?<=>)|(?<=--)|(?<=.))[\s\n\r\t]+((?=--)|(?=<))/U",'',$text);
?>
Условие (?<=--)
включено для:
<!--
текст
-->
Можно включать и JavaScript, с экранированием (или заменой) одинарных кавычек, или в виде подключаемого скрипта <script src=""></script>
.
Вариант третий, через использование cURL
, обрабатывает и результат работы php
:
1. Файл (адрес), откуда будем получать контент (динамический, статический):
text.php
:
<!DOCTYPE>
<html>
<head>
<title>HTML код в одну строку</title>
</head>
<body>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. <br />
Etiam dictum euismod laoreet. <br />
Proin sed turpis eu eros imperdiet condimentum at nec sem. <br />
Cras fermentum rutrum fermentum. <br />
In facilisis scelerisque accumsan. <br />
In vitae justo ut mi tincidunt volutpat vel vitae nibh. <br />
Vestibulum sem orci, accumsan quis gravida et, porttitor nec nisl. <br />
Praesent erat risus, gravida nec volutpat vitae, venenatis eu libero. <br />
Vestibulum lacinia justo at augue cursus tristique. <br />
Proin enim elit, porta venenatis vehicula vel, ornare ut eros. <br />
Etiam adipiscing tincidunt viverra.<br />
Aliquam et nibh justo. <br />
Quisque ut nulla nunc, a vehicula orci.<br />
Nullam eu odio velit, eu molestie odio. <br />
Sed at justo quis massa dictum egestas.<br />
</p>
<!--//-->
<script type="text/javascript">document.write('<h1>JS работает</h1>');</script>
<!--//-->
<!--//-->
<?php
echo "<h1>PHP работает</h1>";
?>
<!--//-->
</body>
</html>
2. Файл (адрес), в который будем вызывать контент, преобразовывать все в одну строку и выводить:
index4.php
:
<?php
//Получаем динамическое (статическое содержимое)
$ch = curl_init ("http://coder.hol.es/example/php/one_line/text.php");
$fp = fopen ("buffer.html", "w");
//открываем буферный (промежуточный файл - уже предварительно его создали) и записываем
curl_setopt ($ch, CURLOPT_FILE, $fp);
curl_setopt ($ch, CURLOPT_HEADER, 0);
curl_exec ($ch);
curl_close ($ch);
fclose ($fp);
//закрываем файл
$file = 'buffer.html';
$buffer = file_get_contents($file);
// Получаем содержимое полученного :) динамического/статического содержимого из файла и помещаем в переменную
function one_line($buffer)
// обрабатываем переменную
{
// удалить пробелы между html тегами, кроме <pre>
$buffer = preg_replace('/(?:(?<=\>)|(?<=\/\>))\s+(?=\<\/?)/', '', $buffer);
if (FALSE === strpos($buffer, '<pre')) {
$buffer = preg_replace('/\s+/', ' ', $buffer);
}
// удалить новые строки,за которыми пробелы
$buffer = preg_replace('/[\t\r]\s+/', ' ', $buffer);
// но сохранить комментарии IE
$buffer = preg_replace('/<!(--)([^\[|\|])^(<!-->.*<!--.*-->)/', '', $buffer);
// и скрыть css комменты
$buffer = preg_replace('/\/\*.*?\*\//', '', $buffer);
//
return $buffer;
}
echo one_line($buffer); //выводим окончательный результат
?>
*UPD:
Пример скрипта, который удаляет из HTML-кода все переводы строки, вытягивая текст "в одну строку" перед посылкой его в браузер. HTML-код от такого преобразования, очевидно, не изменит своего отображения, потому что в нем пробельные символы, как правило, являются незначащими (для переноса строк там используется тег <br />
).
Работа с обработчиками буферов. Файл linearize.php
<?php ## Работа с обработчиками буферов
function ob_linearize($text)
{
// Удалить из текста все переносы строк и повторяющиеся пробелы
return preg_replace('/[\r\n\s]+/s', ' ', trim($text));
}
// Перехватываем выходной поток с установкой обработчика
ob_start("ob_linearize");
// Дальше идет обычное выполнение скрипта. Он может выводить все,
// что угодно - в конце из текста будут удалены все переводы строк.
echo htmlspecialchars(file_get_contents(__FILE__));
ВНИМАНИЕ!
Помните, что любые ошибки в обработчике не будут выведены в браузер, ибо он, как правило, вызывается уже после завершения работы основной программы! Старайтесь не вызывать большие функции из обработчиков, не удостоверившись, что сообщения об ошибках записываются в файлы журнала сервера, иначе отладка программы может превратиться в сущий ад.
*Источник: Котеров Д. В. «PHP 7. Наиболее полное руководство», стр. 890
Смотреть пример – Вариант первый
Смотреть пример – Вариант второй
Смотреть пример – Вариант третий
Смотреть пример – Вариант четвертый, с cURL
Комментарии:
Нет комментариев к этой статье.