Парсинг курса валют
В данной статье хочу познакомить читателей с основами php парсинга.
Для примера будем получать официальный курс гривны к доллару с
Данный код вы сможете использовать в дальнейшем, если вам нужно будет производить какие-либо математические операции с курсом, или просто выводить где-то на сайте.
Как работает данный код можно посмотреть здесь.
Сначала приведу весь код, а далее – более подробные пояснения.
Php парсинг курса гривны к доллару с сайта НБУ:
1 2 3 4 5 6 7 8 9 10 11 |
// урл страницы сайта НБУ с курсами валют $url="http://www.bank.gov.ua/control/ru/curmetal/detail/currency?period=daily"; // получаем содержимое страницы-донора в переменную $text = file_get_contents($url); // разбираем содержимое с помощью регулярных выражений preg_match('#<td class="cell_c">USD</td>.*?</tr>#is', $text, $arr); preg_match_all('#<td class="cell_c">(.*?)</td>#is', $arr[0], $arr); // выводим результат echo "{$arr[1][1]} {$arr[1][0]} = <b>{$arr[1][2]}</b> UAH"; |
Пояснения к коду.
Строки кода 3 и 5, думаю, понятны – получаем всё содержимое страницы сайта-донора.
Далее, заходим на
1 2 3 4 5 6 7 8 9 10 |
<tr> <td class="cell_c">840</td> <td class="cell_c">USD</td> <td class="cell_c">100</td> <td class="cell"></td> <td class="cell_c">799.3000</td> </tr> |
Анализируем данный фрагмент. Чтобы получить значение курса нам нужно написать регулярное выражение, которое получит весь код между уникальным кодом в
строке 4: <td class="cell_c">USD</td>
и
строке 9: </tr>
Ранее в статье "Php получить текст между тегами" я подробно описал как составить правильное регулярное выражение, поэтому здесь привожу уже готовую регулярку без дополнительных пояснений.
1 2 3 |
preg_match('#<td class="cell_c">USD</td>.*?</tr>#is', $text, $arr); |
Таким образом, в элементе массива $arr[0]
будет храниться следующее значение:
1 2 3 4 5 6 7 8 9 10 11 |
Array ( [0] => <td class="cell_c">USD</td> <td class="cell_c">100</td> <td class="cell"></td> <td class="cell_c">799.3000</td> </tr> ) |
Следующим регулярным выражением получим все значения между тегами
<td class="cell_c">
и </td>
:
1 2 3 |
preg_match_all('#<td class="cell_c">(.*?)</td>#is', $arr[0], $arr); |
Теперь содержимое массива $arr
такое:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Array ( [0] => Array ( [0] => <td class="cell_c">USD</td> [1] => <td class="cell_c">100</td> [2] => <td class="cell_c">799.3000</td> ) [1] => Array ( [0] => USD [1] => 100 [2] => 799.3000 ) ) |
Собственно, можно считать, что курс валют уже получен. Он храниться в $arr[1][2]
.
А дальше делайте с ним что необходимо. Можно сформировать строку и вывести её, как я сделал в своём рабочем примере (ссылка в начале статьи).
1 2 3 |
echo "{$arr[1][1]} {$arr[1][0]} = {$arr[1][2]} UAH"; |
Естественно, если изменится структура страницы-донора, то нужно будет вносить изменения в код.
Аналогично можно получать и другие данные с сайтов.
Если есть какие-то вопросы – пишите в комментарии.
Подскажите как выводить результат не в виде массива?
например так:
1 USD – 65.15
Не могли бы вы привести с сохранением результата в xml?
Да, возможно, на сайте структура изменилась, я не отслеживал. Спасибо за комментарий!
По состоянию на начало мая 2014, для того чтобы вытянуть USD:
$url = “http://www.bank.gov.ua/control/ru/curmetal/detail/currency?period=daily”;
$text = file_get_contents($url);
preg_match(‘#100 Доларів США.*?#is’, $text, $arr);
preg_match_all(‘#(.*?)#is’, $arr[0], $arr);
$usd = trim(strip_tags($arr[0][0]));
echo $usd;