Парсинг курса валют на PHP

парсинг

От автора: Я хочу продемонстрировать несколько способов parsing`а одной и той же страницы. В этом уроке я покажу, как этом можно делать при помощи регулярных выражений. Цель нашего урока, это спарсить курсы валют с какого-нибудь сайта и вывести их у себя на странице в сайдбаре. Т.к. у нас сайта нет, мы просто выведем в файле index.php таблицу с данными о валютах.

Скачать исходный код себе на компьютер!

Во-первых, разберемся с понятием «Регулярное выражение». Что это и с чем его едят? Объясняю.

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

Начнем

Создадим файл parser.php, а в нем функцию get_currency($charcode), где $charcode символьное обозначение валюты.

function get_currency($chrcode){

Укажем, что переменная $xml есть строкой, а $data — массивом

$xml = '';
$data = array();

Если невозможно получить исходный код из запрашиваемой страницы, то, соответственно, вывести сообщение об ошибке.

if(!$xml = @file_get_contents('kurыs.xml')){
return false;
}
}

Далее проверим переменную $date, является ли она массивом.

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)

Где $xml это объект, в котором искать соответствие и $matches – переменная-массив, в которой хранятся все найденные по шаблону соответствия.

Но мы должны проверить это регулярное выражение на соответствие с заданным шаблоном ‘#.*’.$chrcode.’.*(.*).*(.*).*#isU’ Если проверка не проходит, выводим сообщение об ошибке.

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;

return $data;

Теперь очередь ветки, если $data не массив. И опять идет проверка регулярки и т.д., что было описано выше. Ну и возвратить значение $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;
}

А теперь просто создадим переменную вне функции, например $uah и присвоить ей функцию get_currency(‘UAH’) или массивом get_currency(array(‘UAH’,'CZK’,'SEK’)), где ‘UAH’ символьное обозначение украинской гривны.

И, например, вывести её курс к доллару.

Весь файл parser.php:

<?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

<?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. Хотите опубликовать интересный тематический материал и заработать? Если ответ «Да», то жмите сюда.

Курс по программированию на языке PHP

Изучите PHP с нуля до результата!

Смотреть курс

Метки: , ,

Комментарии Вконтакте:

Комментарии Facebook:

Комментарии (18)

  1. phz

    А ссылку откуда парсить?

  2. Never Lex

    Как-то нужно было парсить курсы валют по отношению к украинской гривне. Не заморачивался и парсил обычную html страничку. Как-то не нашёл где XML хороший подхватить. В целом парсер состоял из нескольких ОЧЕНЬ простых строк и отлично работает до сих пор.

    Конечно придётся переписать немного, если вёрстку поменяют, но работает на УРА :)

  3. дядя Валера, эсквайр

    Влад, безусловно, ты — интересный человек и программист. Мне, как Чайнику сюда лезть бы не надо, но была просьба — получай: Всем своим дилетантским нутром чую — вещь сия будет тормозить, причем весьма значительно загрузку сайта, да и зачем оно надо, когда, например, в браузере Гугл Хром можно сопоставить все курсы всех валют? Извини за строгость..

    • Виктор Рог

      Такие комментарии очень даже принимаются, так что не извиняйтесь за строгость!

    • gromitsu

      Чтобы не загружать сервак, можно либо использовать CRON, либо самому написать, чтобы парсило через каждое вами определенное время.
      За Гугл Хром спасибо, как-то не подумал.

      • Never Lex

        Ага, можно раз в сутки по крону парсить. Или написать свой небольшой CRON для бедных, я о таком статью писал :)

        Но парсить и выводить в поток это конечно адское зло. Статья учебная, а не решает ваших проблем. Учитесь, а не просто выдирайте код.

    • gromitsu

      Спасибо Never Lex
      Мы трактуем постулаты или аксиомы. Что нужно так и не иначе. Мы показываем, как этом можно решить из множества способов.

  4. Геннадий

    А вы для кого эту рассылку делаете? Регулярные выражения — это … синтаксический анализ текста.. ( а что такое синтаксический анализ текста?). Шаблон — это… символы и спецсимволы (символ с мигалкой что-ли?), модификатор (а что такое модификатор?). Пожалуйста: или рассылайте тем, кто премии получает за математику, или тем, кто работает у Бил Гейтса, или в Интел… Либо сделайте приписку, что без окончания такого-то курса по програмированию рассылки не читать (и ссылку на учебники).

    • gromitsu

      Ход твоих мыслей ясен. Спасибо.

    • Виктор Рог

      Геннадий, дело в том, что начинать каждую статью с теоретических основ php, а потом переходить к практике мы не можем. В статьях мы стараемся предлагать практическое применение теоретических знаний.

  5. alex

    для этой статьи не хватает калькулятора (конвертора) валют. я считаю, что нет смысла в выводе курса валют если нет калькулятора.
    PS поясню, может не так выражаюсь. я имею ввиду, чтоб при наборе 100$ сразу же высчитывалась сумма всех валют относительно курса банка

    • gromitsu

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

  6. Артем

    Я конечно извиняюсь, но не лучше ли «снимать» курс валют с web — сервиса сайта цб РФ раз в сутки. А у себя на сайте выдавать инфу с этого «снимка» ? Да, там не только курсы валют. Ребят напишите про использование SOAP — клиента, разбор wsdl — файла, и работу с xml — вот это будет то, что надо! А регулярки оставьте для других целей. ИМХО.

  7. Xinvest

    Гораздо легче поставить готовые информеры с финансовых ресурсов.

  8. Александр

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

    это можно прокомментировать так, читать книгу и не знать о чём читать, если статья пишется о парсере, то в первую очередь нужно сообщать об источнике, иначе ваш парсер нафиг никому не нужен…
    минус и ещё раз вам минус…

    • Виктор Рог

      Спасибо за комментарий. Мы учтем недостатки. Благодаря Вашим комментариям мы понимаем где находятся «дыры» в предоставлении Вам материала.

  9. ximera

    Виктор, Андрей большое спасибо за ваши уроки, все четко и понятно, в принципи как и в во всех предыдущих )))…

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree