Главная
домен в подарок! подробнее

каталог сайтов www.poiu.ru закрыт. копия сайта www.myphp.net.ru сделана мной без согласия автора, подробнее тут


Уроки PHP.

Работа с удаленными документами.

Служебные секретные документы
существуют не для того,
чтобы защищать секреты, а для
того, чтобы защищать служащих.
Джонатан Линн и Энтони Джей

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

Обращение к веб-документам.

Обращение к документам, расположенным на удаленном сервере, производится уже знакомой нам функцией fopen(). Как вы понимаете, в этом случае она может быть вызвана только в режиме чтения.

Далее с полученным дескриптором файла можно делать все то же, что и с дескриптором локального файла. Например, можно вывести все содержимое на экран пользователя:

if (!($fp = fopen("http://someurl.com/", "r") ) exit("Не могу соединиться");
fpassthru($fp);

Функцией fpassthru() мы просто вывели все содержимое веб-документа, то есть на своей странице мы получим точную копию желаемой страницы.

Извлечение информации из документа.

Чаще всего работа с удаленными файлами проводится для получения необходимой информации из целого документа. Примером может служить установленный на сайте прогноз погоды, получаемый, например, с Метеобюро, либо курс доллара с http://www.rbc.ru/, либо афоризм дня или лучший анекдот. Все это и многое другое можно создать с помощью сетевых возможностей PHP.

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

Скрипт по показу анекдотов.

В качестве иллюстрации к вышесказанному предлагаю написать скрипт, который будет выводить анекдоты с сайта Анекдоты на Кроватке в соответствии с указанным пользователем рейтингом.

Сперва напишем функцию, которая выводила бы форму для задания диапазона рейтингов анекдотов для вывода.

Мы вставили элемент Select, с помощью которого пользователь будет определять нижний предел для рейтинга. Теперь добавим второй Select - для верхней границы рейтинга.

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

Данная функция начинается с получения дескриптора удаленного файла. Если происходит ошибка, выходим из скрипта, выводя соответствующее предупреждение. Далее мы считываем файл, указывая немыслимо большой размер документа, чтобы гарантированно считать весь файл. Напомню, что мы не можем использовать функцию filesize(), так как она работает только с локальными объектами.

Следующей строкой мы обрезаем пустые символы по краям текста, а также удаляем повторяющиеся пробелы. Обратите внимание на следующую строку: меняем кодировку текста с koi-8 на windows-1251, так как файл читается с удаленного сервера именно в этой нежелательной для нас кодировке.

После идет ключевой момент всей функции: с помощью регулярных выражений мы сначала помещаем в массив $anecdots найденные анекдоты, а в массив $rating - их рейтинг. Рассмотрим, как это делается. 

Заглянув в HTML-код страницы с анекдотами, мы увидим, каким образом они располагаются:

...
<br>
<center><hr width=80%></center> Сам анекдот. 
<br><br> 
Рассказал(а) <a href="mailto:some@email.ru"><b>Имя рассказавшего</b></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
Рейтинг: <b>Число</b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
Оценить: ...

Отсюда мы можем сделать вывод, что интересующие нас данные находятся между выделенными последовательностями символов. Причем мы можем с достаточной долей уверенностью утверждать, что они однозначно определяют необходимую информацию: для тела анекдота таким уникальным указателем является тег <hr ...>, а для рейтинга - слово "Рейтинг". Больше таких последовательностей символов в документе не встречается.

Исходя из полученных умозаключений, мы составили регулярные выражения, причем с использованием подшаблонов, заключенных в скобках. Напомню, что функция preg_match_all() помещает строки, соответствующие подшаблонам, в массив с индексом 1, то есть сами анекдоты (без посторонних HTML тегов) будут храниться в массиве $anecdots[1], а  числа-рейтинги - в массиве $rating[1].

Ну, а теперь осталось самое легкое - вывести подходящие условию анекдоты на экран пользователя:

Если максимум указан как неограниченный, то верхний предел мы устанавливаем невероятно большим. Далее мы просматриваем весь массив с рейтингами, и если его элемент находится в заданном диапазоне, то мы выводим анекдот, соответствующий этому рейтингу, и внизу пишем сам рейтинг, причем используем массив $rating[0], то есть выводим строку, соответствующую всему шаблону поиска рейтинга. Таким образом, у нас выведется не просто цифра, а "Рейтинг: <b>цифра</b>".

И, наконец, нам осталось только грамотно вызвать написанные функции:

if ( isset($min) && isset($max) ) show_anecdots($min, $max); 
    else show_form();
?>

Я хотел дать возможность читателям испытать скрипт в действии, но, к сожалению, хостинг этого сайта не дает возможности обращения к файлам других серверов. Так что пробуйте сами.

До встречи на следующем уроке!

Назад, на урок 11

Дальше, на урок 13