[PHP] Jak pobrać i pokazać aktualne notowania średnich kursów walut z NBP?
Chcesz umieścić na stronie aktualne notowania średnich kursów walut z NBP.
Skrypt jest bardzo przydatny dla wszystkich serwisów z pogranicza biznesu i finansów. Wiele osób potrzebuje sprawdzić aktualne notowania i zamiast szukać ich w Sieci, może je oglądać na Twojej stronie.
Prosty skrypt umożliwia pobranie notować u samego źródła, czyli ze stron NBP. Zobacz jak pobrać i wstawić na stronę aktualne kursy walut:
<?
$f = @fopen("http://www.nbp.pl/Kursy/KursyA.html", "r");
if ($f) {
while(!feof($f)) $strona.= fread($f,1024); fclose($f);
$strona = preg_replace("/\r/", " ", $strona);
$strona = preg_replace("/\n/", " ", $strona);
preg_match("/z dnia <b>(.*?)<\/b>/", $strona, $zdnia);
echo "<br>średnie kursy walut <br>NBP z ". $zdnia[1];
preg_match_all("/<tr valign=\"middle\">.*?<\/tr>/", $strona, $sa);
for ($i=1; $i<count($sa[0]); $i++) {
$kursy[] = explode("`",preg_replace(
"/.*?<td.*?>(.*?)<\/td>.*?<td.*?>(.*?)<\/td>.*?<td.*?>(.*?)<\/td>.*/",
"$1`$2`$3",$sa[0][$i]));
}
}
for ($i=0; $i<count($kursy); $i++) {
if (eregi("USD",$kursy[$i][1])) echo "<br>1 USD - ".$kursy[$i][2];
if (eregi("EUR",$kursy[$i][1])) echo "<br>1 EUR - ".$kursy[$i][2];
if (eregi("GBP",$kursy[$i][1])) echo "<br>1 GBP - ".$kursy[$i][2];
}
?>
Przykład:
średnie kursy walut
NBP z 2004-05-14
1 USD - 4,0340
1 EUR - 4,7593
1 GBP - 7,0702
Kursy można pobrać na dwa sposoby - albo odczytać je ze strony WWW (jej adres jest stały) albo pobrać z pliku XML (ale adres tej strony zmienia się codziennie). Łatwiejszy wariant odczytania notowań to pobranie ich ze strony WWW.
Po wczytaniu strony, wystarczy za pomocą wyrażeń regularnych wyciąć z niej odpowiednie fragmenty tabeli i wypisać tylko te waluty, które nas interesują. Możesz oczywiście dopisać nazwy kolejnych walut, przykład obejmuje tylko te najczęściej wykorzystywane, a więc USD, EUR i GBP.
Program przestanie działać w chwili, gdy NBP zmieni adres, układ i kod swoich stron WWW, ale pewnie nie nastąpi to szybko... W razie zmiany kodu na stronie, wystarczy tylko zmodyfikować zawartość wyrażeń regularnych, aby całość nadal działała poprawnie.
W tablicy dwuwymiarowej $kursy zapisane są dane o wszystkich kursach walut. Dla dnia 2004.05.04 struktura tablicy prezentuje się następująco:
Array
(
[0] => Array
(
[0] => dolar amerykański
[1] => 1 USD
[2] => 3,9731
)
[1] => Array
(
[0] => dolar australijski
[1] => 1 AUD
[2] => 2,8841
)
[2] => Array
(
[0] => dolar hongkoński
[1] => 1 HKD
[2] => 0,5093
)
[3] => Array
(
[0] => dolar kanadyjski
[1] => 1 CAD
[2] => 2,9027
)
[4] => Array
(
[0] => euro
[1] => 1 EUR
[2] => 4,7805
)
[5] => Array
(
[0] => forint węgierski
[1] => 100 HUF
[2] => 1,9015
)
[6] => Array
(
[0] => frank szwajcarski
[1] => 1 CHF
[2] => 3,0774
)
[7] => Array
(
[0] => funt cypryjski
[1] => 1 CYP
[2] => 8,1572
)
[8] => Array
(
[0] => funt szterling
[1] => 1 GBP
[2] => 7,1070
)
[9] => Array
(
[0] => hrywna ukraińska
[1] => 1 UAH
[2] => 0,7453
)
[10] => Array
(
[0] => jen japoński
[1] => 100 JPY
[2] => 3,6029
)
[11] => Array
(
[0] => korona czeska
[1] => 1 CZK
[2] => 0,1477
)
[12] => Array
(
[0] => korona duńska
[1] => 1 DKK
[2] => 0,6424
)
[13] => Array
(
[0] => korona estońska
[1] => 1 EEK
[2] => 0,3055
)
[14] => Array
(
[0] => korona norweska
[1] => 1 NOK
[2] => 0,5808
)
[15] => Array
(
[0] => korona słowacka
[1] => 1 SKK
[2] => 0,1187
)
[16] => Array
(
[0] => korona szwedzka
[1] => 1 SEK
[2] => 0,5232
)
[17] => Array
(
[0] => lir maltański
[1] => 1 MTL
[2] => 11,2231
)
[18] => Array
(
[0] => lit litewski
[1] => 1 LTL
[2] => 1,3846
)
[19] => Array
(
[0] => łat łotewski
[1] => 1 LVL
[2] => 7,3052
)
[20] => Array
(
[0] => rand południowoafrykański
[1] => 1 ZAR
[2] => 0,5720
)
[21] => Array
(
[0] => rubel rosyjski
[1] => 1 RUB
[2] => 0,1370
)
[22] => Array
(
[0] => tolar słoweński
[1] => 100 SIT
[2] => 2,0041
)
[23] => Array
(
[0] => SDR (MFW)
[1] => 1 XDR
[2] => 5,8004
)
)
Aby pokazać informacje o Euro możesz użyć $kursy[4][0] dla opisu, $kursy[4][1] dla waluty i $kursy[4][2] dla kursu. Ale lepiej użyć szukania waluty w pętli (jak w skrypcie), bo dzisiaj Euro jest na 5 pozycji, ale za tydzień może być na 15-stej, jeżeli ktoś przestawi kolejność tabeli.