[ главная ]   [ рейтинг статей ]   [ справочник радиолюбителя ]   [ новости мира ИТ ]



Ответов: 0
25-02-12 07:01







   Web - программирование
PHP


ASP






XML



CSS

SSI





   Программирование под ОС











   Web - технологии








   Базы Данных









   Графика






Данные




Web - программирование / PHP /

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<?function show_form() {?>

<form method="post" action="">

<table width="200" border="0" cellspacing="0" cellpadding="2">

<tr>

<td>Минимальный рейтинг</td>

<td><select name="min">

<?for ($i = 0; $i < 11; $i++) {
echo "<option";

if ($i == 5) echo " selected";

echo ">".$i."/option>n";}?>

>/select></td>

</tr>

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

<tr>

<td>Максимальный рейтинг</td>

<td><select name="max">

<?for ($i = 6; $i < 17; $i++) {

   echo "<option";

   if ($i == 16) {

      echo " value='no' selected>";

      echo "Неограниченный</option>n";continue;

   }

   echo ">".$i."/option>n";}?>

</select></td>

</tr>

<tr>

<td><input type="submit" value="Показать"></td>

<td></td>

</tr>

</table>

</form>

<?}    // конец функции show_form()

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

function show_anecdots($min, $max) {
   if ( !($fp = fopen("http://www.umora.ru/", "r")) ) exit("Не могу соединиться");
   $file = fread($fp, 1500000);
   $file = trim(chop($file));
   $file = convert_cyr_string($file, "k", "w");
   preg_match_all("!<center><hr width=80%></center>([^<]+)<br><br>!si", $file, $anecdots);
preg_match_all("!Рейтинг: <b>([^<]+)</b>!si", $file, $rating);

 

Данная функция начинается с получения дескриптора удаленного файла. Если происходит ошибка, выходим из скрипта, выводя соответствующее предупреждение. Далее мы считываем файл, указывая немыслимо большой размердокумента, чтобы гарантированно считать весьфайл. Напомню, что мы не можем использовать функцию 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>

      

Рейтинг: <b>Число</b>

       

Оценить: ...

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

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

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

if ($max == 'no') $max = 999;

for ($i = 0; $i < sizeof($rating[1]); $i++) {

   if ((int)$rating[1][$i] >= $min && (int)$rating[1][$i] <= $max) {

      echo $anecdots[1][$i] . "<br><br>";

      echo $rating[0][$i] . "<hr>";
   }
}

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

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

if ( isset($min) && isset($max) ) show_anecdots($min, $max);

else show_form();
?>

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

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

Источник: http://myphp.net.ru/




Комментарии

 Ваш комментарий к данному материалу будет интересен нам и нашим читателям!



Последние статьи: Web - программирование / PHP /

GTK+: перспективы развития
02-03-2010   

Библиотека GTK+ прошла долгий путь развития и сейчас очень популярна. GNOME, одна из ведущих оконных сред, использует GTK+ почти исключительно, GIMP построен на GTK+, множество коммерческих разработчиков ПО, таких как Abobe, NVidia и VMware, решили использовать эту библиотеку в качестве графической основы для своих продуктов... подробнее

Кол. просмотров: общее - 4331 сегодня - 0

Новостной портал
13-11-2009   

Slashdot.org – популярный новостной портал с посещаемостью 50 млн. человек в месяц. Авторы проекта добились такого успеха, предоставляя пользователям свежие и интересные новости из мира IT... подробнее

Кол. просмотров: общее - 4190 сегодня - 0

Параллельное выполнение скриптов может нарушить целостность информации в файлах
13-11-2009   

Здесь рассматривается вопрос, что бывает, если запустить некий скрипт почти одновременно (что происходит, например, при большой нагруженности сервера) несколько раз, т.е. запустить несколько копий одного и того же скрипта. И к чему это может привести... подробнее

Кол. просмотров: общее - 4036 сегодня - 1

No spam.php
10-11-2009   

...и снова о спаме. Кто о нем только не писал, и все писали, что это плохо и ай-яй-яй. Я не буду оригинальничать, и тоже скажу – это плохо. Это ай-яй-яй. Как бороться со спамерами со своей стороны... подробнее

Кол. просмотров: общее - 4075 сегодня - 0

Начинаем работу с рисунками в php для Windows
10-11-2009   

Эта статья даст вам общее представление о том, как создавать, обрабатывать и выводить рисунки в PHP4 для Windows... подробнее

Кол. просмотров: общее - 4060 сегодня - 2



  WWW.COMPROG.RU - 2009-2012 | Designed and Powered by Zaipov Renat | Projects