Основы PHP
  Что такое PHP?
  Возможности PHP
  Преимущества PHP
  История развития
  Что нового в PHP5?
  «Движок» PHP
  Переход на PHP 5.3
New Переход на PHP 5.6
  Введение в PHP
  Изучение PHP
  Основы CGI
  Синтаксис PHP
  Типы данных PHP
  Переменные в PHP
  Константы PHP
  Выражения PHP
  Операторы PHP
  Конструкции PHP
  Ссылки в PHP
  PHP и ООП
  Безопасность
  Функции PHP
  Функции по категориям
  Функции по алфавиту
  Стандартные функции
  Пользовательские
  PHP и HTTP
  Работа с формами
  PHP и Upload
  PHP и Cookies
  PHP и базы данных
  PHP и MySQL
  Документация MySQL
  Учебники
  Учебники по PHP
  Учебники по MySQL
  Другие учебники
  Уроки PHP
  Введение
  Самые основы
  Управление
  Функции
  Документация
  Математика
  Файлы
  Основы SQL
  Дата и время
  CURL
  Изображения
  Стили
  Безопасность
  Установка
  Проектирование БД
  Регулярные выражения
  Подготовка к работе
  Быстрый старт
  Установка PHP
  Установка MySQL
  Конфигурация PHP
  Download / Скачать
  Скачать Apache
  Скачать PHP
  Скачать PECL
  Скачать PEAR
  Скачать MySQL
  Редакторы PHP
  Полезные утилиты
  Документация
  PHP скрипты
  Скачать скрипты
  Инструменты
  PHP в примерах
  Новости портала
 Главная   »  Сборник статей
 
 

Использование Output Buffering в PHP

Автор: Dmitry Vereschaka (dmitry.rsl.ru)

Коротко суть проблемы можно изложить так: очень часто те данные, которые вы получаете, например, из базы данных, должны фигурировать в тексте HTML-страницы гораздо ранее того участка программы, который занимается добычей этих данных. Например, заголовок страницы, задаваемый тэгом <title>, зачастую является содержимым какого-либо поля таблицы БД, а блок программы, который обращается к БД, расположен гораздо позже вывода заголовка страницы.

Что делать? Ответ простой - читать документацию. На функции ob_*, начиная с ob_start()

Оказывается, что в PHP есть возможность не сразу выдавать результат работы скрипта браузеру, а сохранять в специальном месте, именуемом Output Buffer (буфер вывода). При этом в PHP есть функции, которые позволяют изменять его содержимое. Еще одним аргументом за ob_start() в самом начале программы является возможность установки различных HTTP-заголовков, например, cookies, в произвольном месте скрипта, а не в самом его начале.

Кстати, в PHP есть возможность "сжать" (заархивировать) результат работы вашего скрипта, дабы уменьшить количество трафика, гуляющего по сети - для этого нужно вызвать функцию ob_start с параметром "ob_gzhandler": ob_start("ob_gzhandler"); Естественно, если браузер не поддерживает сжатый контент - ваша страница будет передана ему без изменений.

А теперь давайте от слов перейдём к конкретным примерам:

Внимание! Здесь и далее предполагается, что в самом начале скрипта включается буферизация вывода:

<?php

ob_start();

?>

Пример 1: автоматическая подсветка переменных.

Предположим, у вас на сайте есть статьи, посвященные PHP. Естественно, они должны содержать и примеры кода на PHP ;) Однако, если весь ваш код будет набран шрифтом одного цвета, то читать этот код будет немного затруднительно. Так давайте раскрасим код! Пусть все имена переменных будут синего цвета. А комментарии - красного (будем считать, что комментарии начинаются c //). Для этого в самом конце скрипта добавляем следующий код:

<?php

$x=ob_get_contents(); // получаем содержимое output buffer

ob_clean(); // очищаем его

$x=preg_replace("/(\\$[\\w]+)/si","<font color=\"blue\">\\1</font>",$x);

// заменяем всё, что начинается со знака $ и продолжается более,

// чем одним алфавитно-цифровым символом

// на то же самое, но обрамлённое тэгами <font> синего цвета

$x=preg_replace("/(?<!:)(\\/\\/[^\\r\\n]+)[\\r\\n]/si","<font color=\"red\">\\1</font>",$x);

// заменяем комментарии на самих себя, но делаем их красного цвета

// (?<!:) нужно, чтобы случайно не поменять ссылки - http://webscript.ru, например.

echo $x; // результат на лицо, то есть в браузер ;)

?>

Естественно, вышеприведённый пример не является идеальным - например, если в вашем тексте встретится код JavaScript, в котором нечаянно окажется комментарий, то работать он перестанет. Однако, с небольшой модификацией, именно этот пример раскрасил, хоть и не идеально, эту статью.

Пример 2: автоматическое распознавание URL и генерация ссылок.

Предположим, у вас на сайте есть гостевая книга или форум, и какой-либо посетитель решил разместить ссылку на свой ресурс. Дабы не утруждать пользователя изучением HTML, было бы удобно сделать так, чтобы все URL, указанные пользователем, автоматически обрамлялись в соответствующие ссылки на языке HTML. Например:

http://php.net => <a href="http://php.net">php.net</a>

ftp://ftp.chg.ru => <a href="ftp://ftp.chg.ru">ftp.chg.ru</a>

Так же было бы полезно преобразовывать следующие строки:

www.webscript.ru => <a href="http://www.webscript.ru">www.webscript.ru</a>

ftp.chg.ru => <a href="http://ftp.chg.ru">ftp.chg.ru</a>

Приступим:

в самом конце вашего скрипта надо дописать следующий код:

<?php

$x=ob_get_contents();

ob_clean();

$x=preg_replace("/(?<!\\/)(www\\.[\\S]+)/si",'<a href="http://\\1">\\1</a>',$x);

// меняем всё, что начинается с www, но не следует после /, на <a href="http://www...">www...</a>

// тут используется "важный" regexp - (?<!\\/) - без него уже существующие ссылки типа

// <a href="http://www..."> тоже бы подверглись преобразованию...

//результат получается не совсем желательным

$x=preg_replace("/(?<!\\/)(ftp\\.[\\S]+)/si",'<a href="ftp://\\1">\\1</a>',$x);

// аналогично поступаем с ftp...

$x=preg_replace("/(?<!\")(http|ftp):\\/\\/(\\S+)/si",'<a href="\\1://\\2">\\2</a>',$x);

// здесь мы обрабатываем строки вида (http|ftp)://что-нибудь, заменяя эту последовательность

// соответствующими тэгами HTML

echo $x;

?>

Пример 3: автоматическая генерация ссылок на разделы вашего сайта

Предположим, что вы являетесь автором какого-либо информационного ресурса, и в своих материалах достаточно часто упоминаете информацию, которая содержится в других разделах вашего сайта. Согласитесь, было бы удобно, если бы все названия разделов, упоминающиеся в тексте статьи, были ссылками на соответствующие разделы. Ну так давайте сделаем это:

<?php

$links=array(

"новости"=>array("url"=>"/news","synonyms"=>"в разделе новостей,последние новости,новости сайта"),

"голосования"=>array("url"=>"/votes","synonyms"=>"раздел голосований,проголосуй")

);

// массив links - это описание соответствий названий разделов и их URL

// естественно, что на вашем сайте он создаётся из БД

// кроме того, для каждого раздела полезно иметь список синонимов

// а то php не силён в падежах, склонениях, спряжениях и т.д.

setlocale(LC_ALL,"ru");

// полезно включить локаль, а то PHP не сможет отличить прописные буквы

// русского языка от их "братьев меньших" ;)

$x=ob_get_contents();

ob_clean();

foreach ($links as $word=>$description) {

$synonyms=split(",",$description['synonyms']);

// берем список синонимов и помещаем их в массив

$synonyms[]=$word;

// слово есть синоним самого себя

foreach ($synonyms as $replace) {

$x=preg_replace("/(\\W)($replace)(\\W)/is", "\\1<a href=\"".$description['url']."\">\\2</a>\\3",$x);

// заменяем все вхождения синонима на ссылку на соответствующий раздел

// сохраняя при этом старое название

}

}

echo $x;

?>

Естественно, приведённый выше пример нельзя считать окончательным - например, если у вас где-нибудь в синонимах встретится какой-то из символов, имеющих специальное значение в perl regular expressions, например, скобки, то результатом выполнения этого кусочка программы могут стать сообщения об ошибках на ваших страницах. Кроме того, приведённое выше регулярное выражение не учитывает, что название раздела уже может являться ссылкой либо её частью, и, соответственно, испортит её.

Но, тем не менее, эта технология, с некоторыми дополнениями, спасает автора этих строк от написания ссылок на разделы своего сайта. Кроме того, именно с использованием output buffering становится очень простым реализация достаточно сложных вещей - например, экспорт данных в excel можно реализовать, написав буквально пару операторов (подсказка: excel умеет импортировать HTML, ну а как отрезать дизайн от экспортируемой таблицы вы, наверное, уже догадались).

 
 » Обсудить эту статью на форуме

 
 Сборник статей 
 Содержание раздела 
Есть еще вопросы или что-то непонятно - добро пожаловать на наш  форум портала PHP.SU 
 

 
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS