Оптимизатор html файлов Версия для печати
 
Здравствуйте дорогие читатели. Сегодня хотелось бы затронуть такую проблему как оптимизация html файлов.

Все мы когда-то подключившись к Интернету удивлялись красоте и посещаемости (а иногда и некрасоте) увиденных интернет проектов. Поэтому сразу возникало желание создать что нибудь такое грандиозное, чтобы все сёрферы Интернета аж охнули от увиденного.

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

Посидев пару дней я постарался сделать программу, которая будет по возможности качественно оптимизировать html файлы. Для описания качества работы программы хотелось бы сказать, что скаченный файл с Интернета весом 71 кВ был оптимизирован с помощью программы WebOptHtml_v_1.0 до 46,4 кВ я думаю это о чём - то говорит.

Возможности программы:
- Удаление комментариев из html файлов;
- Удаление пробелов внутри html тэгов (< / font > или , или < /font>, или , или < /font>);
- Возведение html тэгов в верхний регистр;
- Удаление пустых строк в файлах;
- Удаление знаков табуляции;
- Удаление лишних пробелов.

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

Перед тем как перейти к коду программы хотелось бы сказать: Буду очень благодарен тем кто поможет в усовершенствовании алгоритма обработки html файлов, может кто придумает новые функции. Если что обращайтесь WebOptHtml_v_1.0 Буду рад услышать Ваши предложения.

Код программы:

CLASS OPT
{

//Каталог файлов для обработки
var $DIR_FILE="file";

//Каталог оптимизированных файлов
var $DIR_OPT="opt";

//Контент файла при его чтении
var $CONTENT;

//Массив файлов
var $ARRAY_FILE;

//Уникальный номер файла
var $id="";

//==============Функция удаления пробелов===========//
//@Удаляем лишние пробелы из html тэгов
function delete_gap_tag()
{
$this->CONTENT[$this->id]=preg_replace_callback('/()/im', create_function('$tag', 'return preg_replace("/s/i", "", $tag[0]);'), $this->CONTENT[$this->id]);
return TRUE;
}

//===============Функция возведения html тэгов в верхний регистр==========//
//@Возводит html тэги в верхний регистр
function strtoupper_tag()
{
$this->CONTENT[$this->id]=preg_replace_callback('{()}im', create_function('$tag', 'return $tag[1].strtoupper($tag[2]).$tag[3];'), $this->CONTENT[$this->id]);
return TRUE;
}

//===============Функция удаления комментариев из html файла==============//
//@Удаляет любые комментарии
function delete_comment()
{
$this->CONTENT[$this->id]=preg_replace_callback('{()}im', create_function('$comment', 'return str_replace($comment[1].$comment[2].$comment[3], "", $comment[0]);'), $this->CONTENT[$this->id]);
return TRUE;
}

В данной функции можно легко настроить количество обрабатываемых пробелов.
//==============Функция удаления лишних пробелов в файле==================//
//@Удаляет лишние пробелы в файле
//@Удаляет от 2 до 10 лишних пробелов
//@Можно редактировать количество
function delete_gap_file()
{
$this->CONTENT[$this->id]=preg_replace("/ss/i", " ", $this->CONTENT[$this->id]);
$this->CONTENT[$this->id]=preg_replace("/sss/i", " ", $this->CONTENT[$this->id]);
$this->CONTENT[$this->id]=preg_replace("/ssss/i", " ", $this->CONTENT[$this->id]);
$this->CONTENT[$this->id]=preg_replace("/sssss/i", " ", $this->CONTENT[$this->id]);
$this->CONTENT[$this->id]=preg_replace("/ssssss/i", " ", $this->CONTENT[$this->id]);
$this->CONTENT[$this->id]=preg_replace("/sssssss/i", " ", $this->CONTENT[$this->id]);
$this->CONTENT[$this->id]=preg_replace("/ssssssss/i", " ", $this->CONTENT[$this->id]);
$this->CONTENT[$this->id]=preg_replace("/sssssssss/i", " ", $this->CONTENT[$this->id]);
$this->CONTENT[$this->id]=preg_replace("/ssssssssss/i", " ", $this->CONTENT[$this->id]);
$this->CONTENT[$this->id]=trim($this->CONTENT[$this->id]);
return TRUE;
}

В данной функции можно настраивать количество обрабатываемых пустых строк. Если Вы хотите чтобы файл сохранял читабельный вид html вёрстки удалите первую строчку функции.
Первая строка добавленя в целях уменьшения строк в файле и соответсвенно размера файла, но при добавлении этой строчки абсолютно теряется читабельность html вёрстки.
//=================Функция удаления лишних переводов строк==============//
//@Удаляет лишние
//@Удаляет от 2 до 4 лишних пропусков строк
//@Можно редактировать количество
function nl2br_file()
{
$this->CONTENT[$this->id]=str_replace(" ", "", $this->CONTENT[$this->id]);
$this->CONTENT[$this->id]=str_replace(" ", " ", $this->CONTENT[$this->id]);
$this->CONTENT[$this->id]=str_replace(" ", " ", $this->CONTENT[$this->id]);
$this->CONTENT[$this->id]=str_replace(" ", " ", $this->CONTENT[$this->id]);
return TRUE;
}

В данной функции можно редактировать количество обрабатываемых знаков табуляции.
//================Функция удаления знаков табуляции=============//
//@Удаляет лишние
//@Удаляет от 1 до 3 табов
//@Можно редактировать количество
function delete_tab()
{
$this->CONTENT[$this->id]=str_replace(" ", "", $this->CONTENT[$this->id]);
$this->CONTENT[$this->id]=str_replace(" ", "", $this->CONTENT[$this->id]);
$this->CONTENT[$this->id]=str_replace(" ", "", $this->CONTENT[$this->id]);
return TRUE;
}

Главная функция сделана в таком виде лиш потому что программа имеет графический интерфейс, и опции обработки html файлов. Поэтому если вы не хотите делать графический интерфейс, то можете удалить оператор switch и оставить 'case"all":'.
//======================Функция перезаписи контента файла===============//
//@Записывает в файл новый контент
function new_file($file)
{
$fp=fopen($this->DIR_OPT."/".$file, "w");
flock($fp, LOCK_EX);
rewind($fp);
fwrite($fp, $this->CONTENT[$this->id]);
fclose($fp);
}

//======================Главная функция ==========================//
function haupt_processing($array, $type)
{
switch($type)
{
/*Возведение тэгов верхний регистр*/
case"strtoupper":
$this->ARRAY_FILE=explode(",", $array); //Разбиваем файлы по запятым
while(list($key, $file)=each($this->ARRAY_FILE))
{
$this->id=$key;
$fp=fopen($this->DIR_FILE."/".$file, "rt") or die(trigger_error("Невозможно открыть файл ".$file, E_USER_ERROR)); //Открывает файл
flock($fp, LOCK_EX);//Блокируем файл
rewind($fp); //Установка позиции в начало файла;
$this->CONTENT[$this->id]=fread($fp, filesize($this->DIR_FILE."/".$file)); //Прочитывает контент файла
fclose($fp); //Закрытие файла
$this->strtoupper_tag(); //Верхний регистр
$this->new_file($file); //Запись
}
break;

/*Все опции оптимизатора*/
case"all":
$this->ARRAY_FILE=explode(",", $array);
while(list($key, $file)=each($this->ARRAY_FILE))
{
$this->id=$key;
$fp=fopen($this->DIR_FILE."/".$file, "rt") or die(trigger_error("Невозможно открыть файл ".$file, E_USER_ERROR));
flock($fp, LOCK_EX);
rewind($fp);
$this->CONTENT[$this->id]=fread($fp, filesize($this->DIR_FILE."/".$file));
fclose($fp);
$this->delete_gap_tag();
$this->strtoupper_tag();
$this->delete_comment();
$this->nl2br_file();
$this->delete_tab();
$this->delete_gap_file();
$this->new_file($file);
}
break;

/*Удаление пробелов в тэгах*/
case"delete_grap_tag":
$this->ARRAY_FILE=explode(",", $array);
while(list($key, $file)=each($this->ARRAY_FILE))
{
$this->id=$key;
$fp=fopen($this->DIR_FILE."/".$file, "rt") or die(trigger_error("Невозможно открыть файл ".$file, E_USER_ERROR));
flock($fp, LOCK_EX);
rewind($fp);
$this->CONTENT[$this->id]=fread($fp, filesize($this->DIR_FILE."/".$file));
fclose($fp);
$this->delete_gap_tag();
$this->new_file($file);
}
break;

/*Удаление комментариев из файла*/
case"delete_comment":
$this->ARRAY_FILE=explode(",", $array);
while(list($key, $file)=each($this->ARRAY_FILE))
{
$this->id=$key;
$fp=fopen($this->DIR_FILE."/".$file, "rt") or die(trigger_error("Невозможно открыть файл ".$file, E_USER_ERROR));
flock($fp, LOCK_EX);
rewind($fp);
$this->CONTENT[$this->id]=fread($fp, filesize($this->DIR_FILE."/".$file));
fclose($fp);
$this->delete_comment();
$this->new_file($file);
}
break;

/*Удаление пробелов из файла*/
case"delete_gap_file":
$this->ARRAY_FILE=explode(",", $array);
while(list($key, $file)=each($this->ARRAY_FILE))
{
$this->id=$key;
$fp=fopen($this->DIR_FILE."/".$file, "rt") or die(trigger_error("Невозможно открыть файл ".$file, E_USER_ERROR));
flock($fp, LOCK_EX);
rewind($fp);
$this->CONTENT[$this->id]=fread($fp, filesize($this->DIR_FILE."/".$file));
fclose($fp);
$this->delete_gap_file();
$this->delete_tab();
$this->new_file($file);
}
break;

/*Удаление переносов строк*/
case"delete_br":
$this->ARRAY_FILE=explode(",", $array);
while(list($key, $file)=each($this->ARRAY_FILE))
{
$this->id=$key;
$fp=fopen($this->DIR_FILE."/".$file, "rt") or die(trigger_error("Невозможно открыть файл ".$file, E_USER_ERROR));
flock($fp, LOCK_EX);
rewind($fp);
$this->CONTENT[$this->id]=fread($fp, filesize($this->DIR_FILE."/".$file));
fclose($fp);
$this->nl2br_file();
$this->new_file($file);
}
break;
}
}
}//End class

Программа WebOptHtml_v_1.0 является лишь попыткой для уменьшения веса html страниц и увеличения скорости их загрузки.

Как работать с программой:

Прежде всего создайте каталоги file - файлы подлежащие оптимизации, opt - оптимизированные файлы.

Для начала работы Вам необходимо указать файлы для обработки в переменной '$array'. Пример задания файлов:1html,2.html,3.html. Список файлов задаётся через запятую без пробелов. Я реализовал графический интерфейс и список файлов у меня поступает из формы.
Желательно чтобы количество обрабатываем файлов было примерно не более 10.

Объявляете класс OPT:
$new=new OPT;
Вызываете главную функцию обработки:
$new->haupt_processing($array, $type)
В параметре '$type' указывается вид обработки - оператор switch. Парметр '$type' я реализовал с помощью формы select.

Если Вы хотите чтобы сохранялась читабельность html вёрстки Вам необходимо удалить первую строчку в функции nl2br_file(). Оптимизация файлов будет намного качественнее если Вы каждый блок файла будете отделять пустой строчкой:
<table>
<tr><td>
текст
</td></tr>

<tr><td>
текст
</td></tr>

Вот и всё на сегодня. Удачи в изучении прекрасного языка PHP.

 
Автор: maksim
 
Оригинал статьи: http://www.woweb.ru/publ/59-1-0-492
 
Рейтинг@Mail.ru
© Студия WEB-дизайна PM-Studio, 2005. Все права защищены.