От автора: Я хочу продемонстрировать несколько способов parsing`а одной и той же страницы. В этом уроке я покажу, как этом можно делать при помощи регулярных выражений. Цель нашего урока, это спарсить курсы валют с какого-нибудь сайта и вывести их у себя на странице в сайдбаре. Т.к. у нас сайта нет, мы просто выведем в файле index.php таблицу с данными о валютах.
Скачать исходный код себе на компьютер!
Во-первых, разберемся с понятием «Регулярное выражение». Что это и с чем его едят? Объясняю.
Регулярные выражения — мощный гибкий инструмент для синтаксического анализа текста в соответствии с определенным шаблоном.
Шаблон — строка символов, спецсимволов и модификаторов, описывающих правила, которым должен соответствовать разбираемый текст.
Начнем
Создадим файл parser.php, а в нем функцию get_currency($charcode), где $charcode символьное обозначение валюты.
1 |
function get_currency($chrcode){ |
Укажем, что переменная $xml есть строкой, а $data — массивом
1 2 |
$xml = ''; $data = array(); |
Если невозможно получить исходный код из запрашиваемой страницы, то, соответственно, вывести сообщение об ошибке.
1 2 3 4 |
if(!$xml = @file_get_contents('kurыs.xml')){ return false; } } |
Далее проверим переменную $date, является ли она массивом.
1 |
if(is_array($chrcode)){ |
Если да, то каждый элемент массива разложить как ключ=>значение.
1 |
foreach($chrcode as $key=>$value){ |
Далее в функции мы будем использовать само регулярное выражение, о котором вначале урока шла речь.
1 2 |
if(preg_match('#<Valute ID=".*">.*<CharCode>'.$value.'</CharCode>.*<Nominal>(.*)</Nominal>.*<Value>(.*)</Value>.*</Valute>#isU', $xml, $matches) |
Где $xml это объект, в котором искать соответствие и $matches – переменная-массив, в которой хранятся все найденные по шаблону соответствия.
Но мы должны проверить это регулярное выражение на соответствие с заданным шаблоном ‘#.*’.$chrcode.’.*(.*).*(.*).*#isU’ Если проверка не проходит, выводим сообщение об ошибке.
1 2 3 4 5 6 7 |
if(preg_match('#<Valute ID=".*">.*<CharCode>'.$value.'</CharCode>.*<Nominal>(.*)</Nominal>.*<Value>(.*)</Value>.*</Valute>#isU', $xml, $matches)){ $data[$value]['nominal'] = $matches[1]; $data[$value]['value'] = $matches[2]; }else{ return false; } |
Ну и в конце этой ветки условия возвратить значение $data;
1 |
return $data; |
Теперь очередь ветки, если $data не массив. И опять идет проверка регулярки и т.д., что было описано выше. Ну и возвратить значение $data.
1 2 3 4 5 6 7 8 9 10 |
}else{ if(preg_match('#<Valute ID=".*">.*<CharCode>'.$chrcode.'</CharCode>.*<Nominal>(.*)</Nominal>.*<Value>(.*)</Value>.*</Valute>#isU', $xml, $matches)){ $data[$chrcode]['nominal'] = $matches[1]; $data[$chrcode]['value'] = $matches[2]; }else{ return false; } return $data; } |
А теперь просто создадим переменную вне функции, например $uah и присвоить ей функцию get_currency(‘UAH’) или массивом get_currency(array(‘UAH’,’CZK’,’SEK’)), где ‘UAH’ символьное обозначение украинской гривны.
И, например, вывести её курс к доллару.
Весь файл parser.php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<?php function get_currency($chrcode){ $xml = ""; $data = array(); if(!$xml = @file_get_contents('kurs.xml')){ return false; } if(is_array($chrcode)){ foreach($chrcode as $key=>$value){ if(preg_match('#<Valute ID=".*">.*<CharCode>'.$value.'</CharCode>.*<Nominal>(.*)</Nominal>.*<Value>(.*)</Value>.*</Valute>#isU', $xml, $matches)){ $data[$value]['nominal'] = $matches[1]; $data[$value]['value'] = $matches[2]; }else{ return false; } } return $data; }else{ if(preg_match('#<Valute ID=".*">.*<CharCode>'.$chrcode.'</CharCode>.*<Nominal>(.*)</Nominal>.*<Value>(.*)</Value>.*</Valute>#isU', $xml, $matches)){ $data[$chrcode]['nominal'] = $matches[1]; $data[$chrcode]['value'] = $matches[2]; }else{ return false; } return $data; } } ?> |
А теперь самое простое: написать таблицу и засунуть в нее данные о валютах.
Index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?php include('parser.php'); if($valutes = get_currency(array('UAH','AUD','USD'))){ ?> <table> <tr> <td></td> <td>UAH</td> <td>USD</td> <td>AUD</td> </tr> <tr> <td>Nominal</td> <td><?php echo $valutes['UAH']['nominal']; ?></td> <td><?php echo $valutes['AUD']['nominal']; ?></td> <td><?php echo $valutes['USD']['nominal']; ?></td> </tr> <tr> <td>Value</td> <td><?php echo $valutes['UAH']['value']; ?></td> <td><?php echo $valutes['AUD']['value']; ?></td> <td><?php echo $valutes['USD']['value']; ?></td> </tr> </table> <?php }else{ echo "Some error. Please fix it!"; } ?> |
При ошибке:
И при нормальном выполнении скрипта:
Вот такой получился урок по парсингу курса валют и вывода его на свою страницу. Надеюсь, он Вам был полезен.
До следующих встреч, уважаемые читатели!
Если есть вопросы, то пишите в комментариях ниже статьи, и я обязательно отвечу!
Автор: Влад Паук
Редакция: Рог Виктор и Андрей Бернацкий. Команда webformyself.
E-mail: contact@webformyself.com
Проект webformyself.com — Как создать свой сайт. Основы самостоятельного сайтостроения
"Киберсант-вебмастер" — самый полный курс по сайтостроению в рунете!
P.S. Хотите опубликовать интересный тематический материал и заработать? Если ответ «Да», то жмите сюда.
Комментарии (19)