От автора: Я хочу продемонстрировать несколько способов parsing`а одной и той же страницы. В этом уроке я покажу, как этом можно делать при помощи регулярных выражений. Цель нашего урока, это спарсить курсы валют с какого-нибудь сайта и вывести их у себя на странице в сайдбаре. Т.к. у нас сайта нет, мы просто выведем в файле index.php таблицу с данными о валютах.
Скачать исходный код себе на компьютер!
Во-первых, разберемся с понятием «Регулярное выражение». Что это и с чем его едят? Объясняю.
Регулярные выражения — мощный гибкий инструмент для синтаксического анализа текста в соответствии с определенным шаблоном.
Шаблон — строка символов, спецсимволов и модификаторов, описывающих правила, которым должен соответствовать разбираемый текст.
Начнем
Создадим файл parser.php, а в нем функцию get_currency($charcode), где $charcode символьное обозначение валюты.

Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать веб-приложение на PHP с полного нуля
Получить курс сейчас! 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; } |

Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать веб-приложение на PHP с полного нуля
Получить курс сейчас!Ну и в конце этой ветки условия возвратить значение $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. Хотите опубликовать интересный тематический материал и заработать? Если ответ «Да», то жмите сюда.

Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать веб-приложение на PHP с полного нуля
Получить курс сейчас!
Разработка веб-приложения на PHP
Скачайте видеокурс и узнайте, как создать веб-приложение на PHP
Скачать
А ссылку откуда парсить?
Как-то нужно было парсить курсы валют по отношению к украинской гривне. Не заморачивался и парсил обычную html страничку. Как-то не нашёл где XML хороший подхватить. В целом парсер состоял из нескольких ОЧЕНЬ простых строк и отлично работает до сих пор.
Конечно придётся переписать немного, если вёрстку поменяют, но работает на УРА
Влад, безусловно, ты — интересный человек и программист. Мне, как Чайнику сюда лезть бы не надо, но была просьба — получай: Всем своим дилетантским нутром чую — вещь сия будет тормозить, причем весьма значительно загрузку сайта, да и зачем оно надо, когда, например, в браузере Гугл Хром можно сопоставить все курсы всех валют? Извини за строгость..
Такие комментарии очень даже принимаются, так что не извиняйтесь за строгость!
Чтобы не загружать сервак, можно либо использовать CRON, либо самому написать, чтобы парсило через каждое вами определенное время.
За Гугл Хром спасибо, как-то не подумал.
Ага, можно раз в сутки по крону парсить. Или написать свой небольшой CRON для бедных, я о таком статью писал
Но парсить и выводить в поток это конечно адское зло. Статья учебная, а не решает ваших проблем. Учитесь, а не просто выдирайте код.
Спасибо Never Lex
Мы трактуем постулаты или аксиомы. Что нужно так и не иначе. Мы показываем, как этом можно решить из множества способов.
А вы для кого эту рассылку делаете? Регулярные выражения — это … синтаксический анализ текста.. ( а что такое синтаксический анализ текста?). Шаблон — это… символы и спецсимволы (символ с мигалкой что-ли?), модификатор (а что такое модификатор?). Пожалуйста: или рассылайте тем, кто премии получает за математику, или тем, кто работает у Бил Гейтса, или в Интел… Либо сделайте приписку, что без окончания такого-то курса по програмированию рассылки не читать (и ссылку на учебники).
Ход твоих мыслей ясен. Спасибо.
Геннадий, дело в том, что начинать каждую статью с теоретических основ php, а потом переходить к практике мы не можем. В статьях мы стараемся предлагать практическое применение теоретических знаний.
для этой статьи не хватает калькулятора (конвертора) валют. я считаю, что нет смысла в выводе курса валют если нет калькулятора.
PS поясню, может не так выражаюсь. я имею ввиду, чтоб при наборе 100$ сразу же высчитывалась сумма всех валют относительно курса банка
Калькулятор курса валют — это уже из другой, хотя и смежной оперы. Спасибо. Я учту.
Я конечно извиняюсь, но не лучше ли «снимать» курс валют с web — сервиса сайта цб РФ раз в сутки. А у себя на сайте выдавать инфу с этого «снимка» ? Да, там не только курсы валют. Ребят напишите про использование SOAP — клиента, разбор wsdl — файла, и работу с xml — вот это будет то, что надо! А регулярки оставьте для других целей. ИМХО.
Гораздо легче поставить готовые информеры с финансовых ресурсов.
А ещё легче заплатить программисту и не морочить себе голову.
ужас, я не понимаю как можно писать такие статьи, это минус вам, вы должны были сразу привести ссылку на адрес откуда парсить данные. Я прочитал статью и ничего не понял пока в один из комментаторов не спросил про ссылку, мда…
это можно прокомментировать так, читать книгу и не знать о чём читать, если статья пишется о парсере, то в первую очередь нужно сообщать об источнике, иначе ваш парсер нафиг никому не нужен…
минус и ещё раз вам минус…
Спасибо за комментарий. Мы учтем недостатки. Благодаря Вашим комментариям мы понимаем где находятся «дыры» в предоставлении Вам материала.
Виктор, Андрей большое спасибо за ваши уроки, все четко и понятно, в принципи как и в во всех предыдущих )))…
Здравствуйте!Это актуально?Парсинг курса валют на PHP