|
|
|
| Добрый день, опять возвращаюсь к курсу валют. Решила воспользоваться предоставленным вами кодом
Помогите, пожалуйста, разобрать при помощи регулярных выражений содержимое моего xml файла, вот кусок из него:
<?xml version="1.0" encoding="UTF-8" ?>
- <ValCurs Date="27.06.2008" name="Официальный курс обмена">
- <Valute ID="47">
<NumCode>978</NumCode>
<CharCode>EUR</CharCode>
<Nominal>1</Nominal>
<Name>Евро</Name>
<Value>15.6087</Value>
</Valute>
- <Valute ID="44">
<NumCode>840</NumCode>
<CharCode>USD</CharCode>
<Nominal>1</Nominal>
<Name>Доллар США</Name>
<Value>9.9340</Value>
</Valute>
- <Valute ID="36">
<NumCode>643</NumCode>
<CharCode>RUB</CharCode>
<Nominal>1</Nominal>
<Name>Российский Рубль</Name>
<Value>0.4232</Value>
</Valute>
|
Спасибо! | |
|
|
|
|
|
|
|
для: Veresk
(27.06.2008 в 11:30)
| | А точно надо регулярные выражения использовать?
Может с помошью xml парсера проще будет? | |
|
|
|
|
|
|
|
для: Veresk
(27.06.2008 в 11:30)
| | На сайте ЦБ РФ есть готовый код. | |
|
|
|
|
|
|
|
для: Veresk
(27.06.2008 в 11:30)
| | Возможно вас заинтересует скрипт по ссылке http://www.softtime.ru/scripts/valute.php. | |
|
|
|
|
|
|
|
для: cheops
(29.06.2008 в 14:36)
| | Добрый день,
по правде говоря, я именно этот скрипт и имела в виду, но, так как я не из России, я должна сослаться на xml файл своего нац. банка, а он у меня не отрабатывает, выдает :
То есть я вставила в ваш код свою ссылку (http://www.bnm.md/ru/official_exchange_rates?get_xml=1&date=30.06.2008) и удалила фрагмент с заменой запятой на точку.
Мне очень-очень нужна ваша помощь!
Спасибо! | |
|
|
|
|
|
|
|
для: Veresk
(30.06.2008 в 09:07)
| | Хм... странно, посмотрите работает ли у вас следующий скрипт (у меня работает)
<?php
// Получаем текущие курсы валют в rss-формате с сайта www.cbr.ru
$content = get_content();
// Разбираем содержимое, при помощи регулярных выражений
$pattern = "#<Valute ID=\"([^\"]+)[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>([^<]+)#i";
preg_match_all($pattern, $content, $out, PREG_SET_ORDER);
$dollar = "";
$euro = "";
foreach($out as $cur)
{
if($cur[2] == 840) $dollar = str_replace(",",".",$cur[4]);
if($cur[2] == 978) $euro = str_replace(",",".",$cur[4]);
}
echo "Доллар - ".$dollar."<br>";
echo "Евро - ".$euro."<br>";
function get_content()
{
// Формируем сегодняшнюю дату
$date = date("d.m.Y");
// Формируем ссылку
$link = "http://www.bnm.md/ru/official_exchange_rates?get_xml=1&date=$date";
// Загружаем HTML-страницу
$fd = fopen($link, "r");
$text="";
if (!$fd) echo "Запрашиваемая страница не найдена";
else
{
// Чтение содержимого файла в переменную $text
while (!feof ($fd)) $text .= fgets($fd, 4096);
}
// Закрыть открытый файловый дескриптор
fclose ($fd);
return $text;
}
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(30.06.2008 в 09:30)
| | да, работает. | |
|
|
|
|
 7.7 Кб |
|
|
для: Veresk
(30.06.2008 в 09:40)
| | Или, может быть, вы поможете мне разобраться с этим кодом (приложила файлы).
Выдает ошибку : "!Внимание, курс валют не соответствует текущей дате 30.06.2008!= 00.00.0000".
Не могу понять, в чем дело, раньше все было в порядке.
Спасибо! | |
|
|
|
|
|
|
|
для: Veresk
(30.06.2008 в 10:43)
| | cheops дал вам на 100% работающий вариант, которым я и сам пользуюсь уже давно, а ваш код "неккоректен" и привязан к xml-парсеру, хотя задача проста и решается одним регулярным выражением | |
|
|
|
|
|
|
|
для: mihdan
(30.06.2008 в 13:08)
| | Да, ваш код работает и у меня тоже, но когда я подставляю свою ссылку(http://www.bnm.md/ru/official_exchange_rates?get_xml=1&date), - он не выдает ничего кроме :
в этом-то и проблема.
помогите, please!!!! | |
|
|
|
|
|
|
|
для: Veresk
(30.06.2008 в 13:50)
| | > http://www.bnm.md/ru/official_exchange_rates?get_xml=1&date
У вас date не имеет значения.
Если вы хотите курс за какое-то число присвойте параметру date значение, например
http://www.bnm.md/ru/official_exchange_rates?get_xml=1&date=30.06.2008 | |
|
|
|
|
|
|
|
для: AcidTrash
(30.06.2008 в 15:15)
| | Ой, точно :)
Большое спасибо!!!
У меня еще вопрос: как часто этот скрипт обращается к банку?
Спасибо! | |
|
|
|
|
|
|
|
для: Veresk
(30.06.2008 в 15:30)
| | С той частотой с которой вы будете его запускать. | |
|
|
|
|
|
|
|
для: AcidTrash
(30.06.2008 в 15:36)
| | То есть, если я вывешу скрипт на сайт и 10 пользователей посетят мою страницу, тогда произойдет 10 обращений скрипта к банку?
Как это можно изменить? Мне необходимо одно или два обращения в сутки к банку.
Спасибо! | |
|
|
|
|
|
|
|
для: Veresk
(30.06.2008 в 16:35)
| | Записывайте полученный курс в базу. Если в базе храниться курс за прошедшее число - идем за обновлением курса и пишем его в базу, иначе выводим из базы. Зачем дважды за курсом обращаться? | |
|
|
|
|
|
|
|
для: sim5
(30.06.2008 в 18:24)
| | Чего-то у меня не получается: необходимо раз в сутки записывать в файл курс валют и вызывать необходимые данные уже из этого файла, а у меня все время вылезают ошибки :(
Вот код:
<?php
$content = get_content();
$pattern = "#<Valute ID=\"([^\"]+)[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>([^<]+)#i";
preg_match_all($pattern, $content, $out, PREG_SET_ORDER);
$dollar = "";
$euro = "";
foreach($out as $cur)
{
if($cur[2] == 840) $dollar = $cur[4];
if($cur[2] == 978) $euro = $cur[4];
}
echo "Dolar - ".$dollar."<br>";
echo "Euro - ".$euro."<br>";
function get_content()
{
$date = date("d/m/Y");
$time = date("H.i");
$link = file_get_contents("http://www.cbr.ru/scripts/XML_daily.asp?date_req=$date");
$cash = "curs.xml";
if ($time = ("08.50") {
$fd = fopen($cash, "w");
fwrite($fd,$link);
fclose ($fd); }
else ($fd = fopen($cash, "r"));
return $cash; }
?>
|
Помогите, ну ОЧЕНЬ надо!!!
Спасибо! | |
|
|
|
|
|
|
|
для: Veresk
(02.07.2008 в 10:09)
| | Можно такой вопрос - почему не в базу? Лучше, по моему, писать в нее, создав поля, например, usd, eur... и cursdate. И почему именно 8:50, вроде курсы валют устанавливаются по окончанию торговой сессии на валютной бирже, но это не как не утро. Почему просто не по дате запрос делать? Кстати в xml файлах это и есть дата, вы, если хотите, можете взять и за период дат, чтобы узнать рост или спад валюты. Просто первый ваш посетитель будет получать новый курс валюты на текущий день, остальные с базы, зачем вам время? | |
|
|
|
|
|
|
|
для: sim5
(02.07.2008 в 10:48)
| | "Не в базу", потому что не работала с базой, вернее работала, но недостаточно, пока мне хотелось бы разобраться с файлами. Время 8:50 я выставила произвольно - для тестирования скрипта :). Если делать запрос по дате, то это необходимо каждый день сравнивать название предыдущего файла с каждым последующим и, затем, удаляя старый, создавать файл с новым именем или как-то иначе?
А что неверно в моем варианте? | |
|
|
|
|
|
|
|
для: Veresk
(02.07.2008 в 12:01)
| | У вас нет закрывающей скобки вот в этой строке: if ($time = ("08.50") {
А вообще же:
<?
//все-таки функции лучше по возможности объявлять вверху,
//а не разбрасывать их без надобности где непопадя,
//удобней код восприниматься будет
function getCurs() {
$date = date("d/m/Y");
$pattern = "#<Valute ID=\"([^\"]+)[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>([^<]+)#i";
$link = @file_get_contents("http://www.cbr.ru/scripts/XML_daily.asp?date_req=$date");
if ($link) {
preg_match_all($pattern, $link, $out, PREG_SET_ORDER);
foreach($out as $cur) {
if($cur[2] == 840) $dollar = str_replace(",",".",$cur[4]);
if($cur[2] == 978) $euro = str_replace(",",".",$cur[4]);
}
$f = fopen("curs.txt","w");
flock($f, LOCK_EX);
fputs($f, $date . "\n". $dollar . "\n" . $euro);
flock($f, LOCK_UN);
fclose($f);
}
}
//получаем текущую дату
$date = date("d/m/Y");
//получаем курсы валют из файла
//первой строкой в файле курса валют идет дата
//если получать и сравнивать эту дату из файла $curs[0]
//с текущей датой $date, то можно знать,
//обращаться ли за новым курсом и если требуется,
//то выполняем getCurs()
$curs = file("curs.txt");
echo "Курс валют на: " . $curs[0] .
"<br>Доллар: " . $curs[1] .
"<br>Евро: " . $curs[2];
?>
|
А уж лучше в базу - простая таблица, исключительно для курсов валют и динамике изменения их, вот и будет первая, все равно придется работать с базой когда нибудь. | |
|
|
|
|
|
|
|
для: Veresk
(02.07.2008 в 12:01)
| | >А что неверно в моем варианте?
Ваш скрипт первой же строкой вызывает функцию get_content()
Функция get_content() практически сразу (независимо от того, когда шло последнее обращение)
дергает сервер центробанка. Насколько я понимаю, именно этого поведения Вы и стремитесь избежать.
Формально, Вам необходимо организовать кеширование запрошенных данных.
Фактически же,
а) перед запросом нужно сделать кое какую проверку см.(в)
б) запрашивая документ с сервера центробанка, его нужно записать к себе (в файл или в БД - неважно) , причем записать помимо файла еще и текущее время.
в) точнее п.а) более подробно: до запроса - сравнить текущее время с записанным временем плюс период опроса(в Вашем случае 12...24 часа , а точнее 12*3600 ... 24*3600 секунд)
Если текущее время меньше - взять содержимое из собственной копии
Если больше - см. п.б.
г) взятое содержимое обработать и выдать пользователю. | |
|
|
|
|
|
|
|
для: Trianon
(02.07.2008 в 13:42)
| | Спасибо!
sim5, к сожалению, у меня ваш код не работает, в том смысле, что не создает он файл curs.txt :(
В чем может быть проблема?
Вот, с горя, взялась за mysql: дело в том, что хочу до пятницы решить эту задачу. | |
|
|
|
|
|
|
|
для: Veresk
(02.07.2008 в 15:07)
| | Вы уверены, что он не создается? Я ведь вам писал пример, в нем нет условия создания его, а подразумевается уже работа с ним. А вот так (поле функции):
<?
//получем текущую дату
$date = date("d/m/Y");
//если нет файла курса, получаем курс валют,
//создавая этот файл
if (!file_exists("curs.txt")) getCurs();
//получаем курсы валют из файла
$curs = file("curs.txt");
if ($date > $curs[0]) {
//если в файле курсов прошедшая дата,
//обновляем курс и открываем заново файл
getCurs();
$curs = file("curs.txt");
}
echo "Курс валют на: " . $curs[0] .
"<br>Доллар: " . $curs[1] .
"<br>Евро: " . $curs[2];
?>
|
| |
|
|
|
|
|
|
|
для: sim5
(02.07.2008 в 15:26)
| | sim5,
блин.. ну нельзя же так... ну не сравнивается дата напрямую ни в каком формате кроме восточного! | |
|
|
|
|
|
|
|
для: Trianon
(02.07.2008 в 16:06)
| | Trianon, вы бы вместо того, чтобы ругаться так (я помню ваше, что вы говорили ранее), написали бы даме, свое предложение, включая время (она ведь что-то по времни хочет, а я сомневаюсь в полезности этого)) Ну не могу я пока убрать свой глючный набор (скачал по ссылке с кучей библиотек его), у меня главная проблема сейчас - закачка массива файлов, а время у меня сейчас сравнивается как захочу, я даже проверить то не все могу, ну если только не по mktime(), в этом случае у меня все ОК. Ну не расписывать же все... кто-то обязательно же заметит и пнет, вы же мимо не прошли!)) | |
|
|
|
|
|
|
|
для: sim5
(02.07.2008 в 16:29)
| |
<?php
$request_period = 12*60*60; // опрос сервера не чаще чем раз в 12 часов.
clearstatcache();
$saved_time = filemtime("rates_file.xml");
if(time() > $saved_time + $request_period)
{
$url = "http://www.bnm.md/md/official_exchange_rates?get_xml=1&date=". date('d.m.Y');
$file = @file_get_contents($url);
file_put_contents('rates_file.xml', $file);
$s = 'requested:';
}
else $s = 'cached:';
$file = file_get_contents('rates_file.xml');
?>
|
to Veresk: После этого кода у Вас в переменной $file оказывается ответ сервера банка.
Либо кешированный либо свежий. Его и надо разбирать.
<?
echo $file;
echo $s;
?>
|
P.S. Код исключительно демонстрационный. Только чтобы показать логику работы.
P.P.S. Конечно, xml нужно разбирать парсером XML, а никакими не регулярками.
Но это уже на совести программиста. | |
|
|
|
|
|
|
|
для: sim5
(02.07.2008 в 16:29)
| | насчет своего набора Вы явно где-то запутались.
Если хотите - стукнитесть в аську, или скиньте свою - попробуем вместе разобраться в чем дело. | |
|
|
|
|
|
|
|
для: Trianon
(02.07.2008 в 17:12)
| | Ну вот видите Trianon, чинно и приятно (хотя надо даму подбивать на использование базы) :)
Я не пользуюсь аськой (Скайп, Агент майла). Я не запутался. Бог с ними со строками, верну назад старый пакет, но потом. Если при рабочем (хотя тоже вопрос, все ли работает) пакете копируется в папку только 5 файлов из формы, но если пятый по счету 6-ой после пустого поля формы, то копируется только 4 файла. Но зато в этом глючном пакете скопируется тоже 5, и даже, если 5-ый, это 6-ой по счету (после пустого поля)! Как-то же надо разобраться с чем это связано, потому и не меняю пока. В сети не нашел подобной проблемы, на форуме Котерова тоже глухо как в танке. Если вы знаете о такой проблеме - буду благодарен за инфу. | |
|
|
|
|
|
|
|
для: sim5
(02.07.2008 в 20:01)
| | Нет. мне эта проблема неизвестна.
HTTPheaders в браузере показывает передачу всех файлов или только первых четырех? | |
|
|
|
|
|
|
|
для: Trianon
(02.07.2008 в 20:44)
| | Все файлы успешно загружаются на сервер, а вот из папки tmp в папку назначения копируются только 5 из них, и на двух испробованных РНР, результат разный, тот, что я указал выше. | |
|
|
|
|
|
|
|
для: sim5
(02.07.2008 в 15:26)
| | sim5, огромное Вам спасибо!!!
Я, все-таки, попытаюсь и для базы данных соорудить код :)
Trianon, а что вы имеете ввиду: почему так нельзя - код, ведь, работает? | |
|
|
|
|
|
|
|
для: Veresk
(02.07.2008 в 16:07)
| | потому что когда придет время сравнить "31/07/2008" и "01/08/2008" , первая строка окажется больше второй. И код рухнет.
И еще. Национальный банк Молдовы дату в таком формате 02/07/2008 не принимает.
Принимает только таком 02.07.2008. Во всяком случае из двух запросов
http://www.bnm.md/md/official_exchange_rates?get_xml=1&date=02/07/2008
http://www.bnm.md/md/official_exchange_rates?get_xml=1&date=02.07.2008
реальный курс на дату выдает только последний. | |
|
|
|
|
|
|
|
для: Trianon
(02.07.2008 в 16:19)
| | Спасибо, Trianon, а насчет дат, я конечно же все это поменяла, просто тестировала со ссылкой на www.cbr.ru :)
Как же избежать такой жуткой ошибки при сравнении дат? | |
|
|
|