Автоматическое обновление своих сайтов было заветной мечтой многих веб-мастеров. Как хорошо, что посетители всегда смогут читать свежие новости и это не потребует ни малейших усилий со стороны владельца сайта! Техническая реализация этой полезной функциональности не представляет никаких затруднений. Вполне подходит для этого такой распространенный в среде веб-мастеров инструмент, как PHP. Рассмотрим тривиальную задачу, заключающуюся в публикации на нашем сайте текущего курса доллара. Для начала следует определиться с источником информации. Курс доллара в Интернете публикуется практически везде, например, на главной странице агентства «РосБизнесКонсалтинг» (www.rbc.ru). Среди представленных там многочисленных показателей (см. рисунок) выбираем курс ЦБ РФ. Импортирование информации из внешних источников – достаточно распространенный прием, применяемый многими вебмастерами. Эта информация извлекается непосредственно из HTML-страниц поставщиков контента, и технология извлечения очень проста. Прежде всего следует тщательно изучить структуру исходного документа и найти в нем интересующие нас сведения (в простейшем случае они будут представлены обычной текстовой строкой). Затем нужно записать фрагменты HTML-кода до и после полезных данных таким образом, чтобы эти фрагменты однозначно идентифицировали их местоположение в документе. Программа, импортирующая информацию из внешнего источника, должна загрузить оттуда HTML-страницу целиком, просканировать ее на наличие указанных фрагментов и взять для дальнейшей обработки то, что находится между ними. Кроме того, для того чтобы не просматривать всю страницу, имеет смысл определить также границы блока, в рамках которого будет осуществляться поиск. Просматривая код главной страницы «РосБизнесКонсалтинга» www.rbc.ru/index.html (листинг 1), находим интересующую нас фразу «USD ЦБ РФ», наличие которой является неплохим признаком начала информационного блока. Смущает, правда, то обстоятельство, что эта последовательность символов запросто может промелькнуть и в тексте новостей, представленных на той же странице. Поэтому имеет смысл использовать в качестве ключевой фразы чуть более расширенный фрагмент, вероятность обнаружения которого в основном тексте намного меньше, – «USD ЦБ РФ». Текущее значение курса доллара находится во второй строке после выбранной нами ключевой фразы. Определим фрагменты HTML-кода, стоящие до и после полезных данных: До: <FONT SIZE="-2"> После: </FONT> Окончательно определившись со структурой документа, можно приступать непосредственно к написанию текста программы. Создадим файл kurs.php и проинициализруем в его начале необходимые для работы переменные: <? // адрес страницы $adr = ’http://www.rbc.ru/index.html’; // идентификатор начала блока $begblock = ’USD ЦБ РФ’; // фрагмент HTML-кода до полезных данных $begin = ’<FONT SIZE="-2"> ’; // фрагмент HTML-кода после полезных данных $end = ’</FONT>’; // массив строк результата $result = array(); // цвет рамки таблицы курса (белый) $brdcolor = ’#ffffff’; // цвет фона ячеек результирующей таблицы $bgcolor = ’#eeeeee’; Для загрузки удаленной страницы вполне подойдет встроенная в PHP функция чтения содержимого файла file($addr), где в качестве $addr можно использовать URL интересующего нас документа. Содержимое страницы записывается в переменную, являющуюся ссылкой на массив отдельных строк. Перебирая циклически все элементы массива, найдем фрагмент, определяющий начало информационного блока. Количество строк (элементов массива) можно определить с помощью встроенной функции sizeof($array), а наличие фрагмента в строке – функцией strpos($array[$i], $begblock), которая возвращает false, если его там нет, и его позицию в противном случае. Перебор осуществляется с помощью оператора цикла while. Не следует забывать, что нумерация элементов массива начинается в PHP с нуля и именно этим значением должна быть проинициализирована переменная счетчика $i. $screen = file($adr); $i = 0; while ($i < sizeof($screen) && strpos($screen[$i], $begblock) == false) { $i++; } В результате выполнения этого фрагмента программы в переменной $i окажется номер строки документа, в которой находится последовательность символов, указывающая на начало информационного блока. Напомним, что значение курса доллара находится в строке с номером $i+2. Для того чтобы извлечь его оттуда, воспользуемся функцией explode($separator, $string). Эта функция разбивает строку на массив подстрок и в качестве первого аргумента получает разделитель, а в качестве второго – исходную строку. Например, результатом выполнения функции explode("+","a+b+c") будет массив строк ("a", "b", "c"). Применив функцию explode к строке с курсом доллара дважды и использовав в качестве разделителя фрагменты кода, стоящие до и после полезных данных, мы тем самым удалим эти фрагменты из строки и выделим требуемое нам значение: $temp = explode($begin, $screen[$i + 2]); $temp = explode($end, $temp); $kurs = $temp[0]; Таким образом мы получили текущее значение курса доллара в переменной $kurs. Осталось вывести эту информацию в окно браузера. Удобнее всего сделать это в виде таблицы, цвета ячеек и границ которой указаны в начале программы. Это осуществляется с помощью функции вывода echo. Для того чтобы вставить в HTML-код значения определенных нами в программе переменных, следует использовать оператор конкатенации строк «.». Для того чтобы кавычки, обозначающие начало или конец строки в PHP, обрабатывались корректно и не смешивались с кавычками, обрамляющими атрибуты HTML, последние следует предварять метасимволом «\». Символ конца строки обозначается в PHP последовательностью «\n»: echo "<table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\"". "border=\"0\" bgcolor=\"".$brdcolor."\"><tr><td>\n". "<table width=\"100%\" cellpadding=\"2\" cellspacing=\"1\" border=\"0\">". "<tr><td bgcolor=\"".$bgcolor."\">курс USD</td></tr><tr>\n"; "<td bgcolor=\"$bgcolor\">".$kurs."</td>". "</tr></table></td></tr></table>"; // конец программы ?> Результатом выполнения программы будет таблица, состоящая из одной ячейки в рамке, где и будет находиться текущее значение курса доллара. Включить данную программу в веб-страницу можно различными способами. Если эта страница является также PHP-скриптом, это можно осуществить с помощью функции require: require("kurs.php"); Если страница – обычный HTML-документ, но веб-сервер поддерживает SSI (server-side includes), то включить в нее результаты работы PHP-скрипта можно с помощью следующей конструкции: <!--#include virtual="dir/kurs.php" --> Должно работать. Рассмотрим чуть менее тривиальный пример. В конце концов, курсы валют можно поместить на страницу с помошью так называемых информеров, бесплатно предлагамых тем же «РосБизнесКонсалтингом». А вот импортирование из внешних источников – лент новостей – может оказаться более интересной задачей. Допустим, нас интересуют последние спортивные новости с сайта «Газеты.Ру», которые можно найти по адресу www.gazeta.ru/sport/index.shtml. Фрагмент этой страницы, содержащий непосредственно блок новостей, показан на листинге 2. В этом фрагменте мы видим возможную ключевую фразу для поиска этого блока: НОВОСТИ СПОРТА</span> В отличие от примера с курсом доллара, число строк, составляющих ленту новостей, может быть разным. Поэтому для ее обработки необходимо определять не только начальную, но и конечную границу информационного блока. В качестве последней вполне можно взять строку комментария, использующуюся в качестве разделителя информационных элементов на сайте «Газеты.Ру»: <!--SNEWS--> Теперь нас интересует не только текст заголовка новости, но и ссылка на саму новость. Не стоит усложнять себе жизнь, извлекая обрывки полезной информации из HTML-кода исходной страницы и потом помещая ее на свой сайт. Намного проще в строках источника просто заменить оформление «Газеты.Ру» на собственное. Для этого составим список HTML-конструкций, подлежащих замене (см. листинг 3). Теперь приступим к написанию программы. Как и раньше, сначала следует определить используемые переменные: <? // адрес страницы $adr=’http://www.gazeta.ru/sport/index.shtml’; // признак начала блока $begblock=’НОВОСТИ СПОРТА</span>’; // признак конца блока $endblock=’<!—SNEWS—>’ // цвет рамки таблицы курса (белый) $brdcolor=’#ffffff’; // цвет фона ячеек таблицы курса $bgcolor=’#eeeeee’; $screen=file($adr); // перебираем все строки страницы for ($i = 0; $i < sizeof($screen); $i++) { if (strpos($screen[$i],$begblock) != false) { $numbegin = $i+1; } if (strpos($screen[$i],$endblock)!=false) { $numend = $i-1; } } // в переменных $numbegin и $numend теперь содержатся // номера строк, соответствующие началу и концу // новостного блока Теперь необходимо перебрать интересующий нас блок строк на предмет наличия фрагментов, указанных в листинге 3, и замены их соответствующими аналогами. Для удобства дальнейшей работы эти фрагменты следует записать в массивы равного размера в строгом порядке соответствия: $old = array(’<img src=/i/t.gif width=1 height=3><br>’, ’</td></tr></table>’, ’<table width=234 cellspacing=0 cellpadding=6’. ’ border=0 bgcolor=#CCCCCC>’, ’<tr><td>’,’"><span class=h17bFF>’, ’</span><br>’,’<span class=h12>’, ’</span></a><br>’, ’<img src=/i/w.gif width=234 height=3><br>’); $new = array(’’, ’’, ’’, ’’, ’" target = "_blank"><span class="style">’, ’ ’, ’’, ’</span></a>’, ’’); $kolstr = sizeof($old); // количество фраз в массивах Теперь заменяем в блоке новостей строки согласно подготовленному нами списку: for ($i = $numbegin; $i<=numend; $i++){ for ($j = 0; $j < $kolstr; $j++) { // функцией str_replace // производится замена одной // фразы в строке на другую: $screen[$i] = str_replace($old[$j], $new[$j], $screen[$i]); } $result[] = $screen[$i]; } После выполнения этих циклов в переменной result окажется обработанная лента новостей с новым дизайном. Осталось вывести ее на экран: for ($i = 0; $i<sizeof($result); $i++) { echo "$result[$i]<br>\n"; } ?> Можно сделать еще один шаг и публиковать на сайте не только заголовки новостей со ссылками на внешние источники, но и непосредственно их тексты. Для этого ссылки на поставщиков контента должны быть заменены обращениями к скрипту, который будет аналогичным образом импортировать содержание новостей. Таким образом можно создать собственный информационный портал, на котором сведения будут собираться из разных источников так, что посетители не будут даже догадываться об этом. Но не следует забывать, что при использовании любых сведений из внешних источников нужно обращать особое внимание на соблюдение авторских прав. Как правило, большинство поставщиков контента регламентируют правила использования опубликованной у них информации. Кроме того, некоторые из них (например, та же «Газета.Ру») позволяют импортировать свои ленты новостей безо всякого программирования, хотя и с меньшими возможностями изменять их внешний вид. В любом случае, перед тем как использовать чужой контент, не помешает согласовать условия публикации непосредственно с владельцами ресурса. Александр Тотоев, totoeval@iworld.ru Листинг 1. www.rbc.ru/index.html (фрагмент) <TD><a href="http://stock.rbc.ru/demo/cb.0/daily/USD.rus.shtml?show=3M"> <FONT COLOR="#333333" SIZE="-2">USD ЦБ РФ</FONT></a></TD> <TD ALIGN="RIGHT"><FONT SIZE="-2">06/03</FONT></TD> <TD ALIGN="RIGHT"><FONT SIZE="-2"> 30,9909</FONT></TD> <TD ALIGN="RIGHT"><FONT SIZE="-2" COLOR="red">-0,004</FONT></TD> Листинг 2. www.gazeta.ru/sport/index.shtml (фрагмент) <span class=h10FF> НОВОСТИ СПОРТА</span><br> <img src=/i/t.gif width=1 height=3><br> </td></tr></table> <table width=234 cellspacing=0 cellpadding=6 border=0 bgcolor=#CCCCCC> <tr><td> <a href="/sportnews.shtml#151697"><span class=h17bFF>18:31</span><br> <span class=h12>Убит бывший президент колумбийского футбольного клуба "Индепендьенте Санта Фе"</span></a><br> </td></tr></table> ... <img src=/i/w.gif width=234 height=3><br> <table width=234 cellspacing=0 cellpadding=6 border=0 bgcolor=#CCCCCC> <tr><td> <a href="/sportnews.shtml#151650"><span class=h17bFF>15:57</span><br> <span class=h12>Решается вопрос, где разместить официальных лиц во время Олимпиады 2004 года</span></a><br> </td></tr></table> <img src=/i/w.gif width=234 height=3><br> <!--SNEWS--> Листинг 3. Преобразование формата новостей «Газеты.Ру»: Фрагменты кода исходной страницы: 1. ’<img src=/i/t.gif width=1 height=3><br>’ 2. ’</td></tr></table>’ 3. ’<table width=234 cellspacing=0 cellpadding=6 border=0 bgcolor=#CCCCCC>’ 4. ’<tr><td>" 5. ’"><span class=h17bFF>’ 6. ’</span><br>’ 7. ’<span class=h12>’ 8. ’</span></a><br>’ 9. ’<img src=/i/w.gif width=234 height=3><br>’ Соответствующие им фрагменты результирующего кода: 1. ’’ 2. ’’ 3. ’’ 4. ’’ 5. ’" target="_blank"><span class="style>"’ 6. ’ ’ 7. ’’ 8. ’</span></a>’ 9. ’’ (’’ означает, что строка будет удалена.) Полезные ссылки: www.php.net – официальный сайт PHP; www.phpclub.net – клуб PHP-разработчиков (на русском языке); www.webclub.ru/content/programming_php – раздел о программировании на PHP в библиотеке «Веб-клуба»; www.citforum.ru/internet/php.shtml – раздел о программировании на PHP на «СИТфоруме»; http://detail.phpclub.net – PHP в деталях. |