Получение курса валют

Тема в разделе ".:: Готовые решения", создана пользователем akhkharu, 28 май 2008.

Статус темы:
Закрыта.
  1. akhkharu

    akhkharu Постоялец

    Регистр.:
    26 июн 2007
    Сообщения:
    111
    Симпатии:
    12
    Условия: PHP5. Можно запускать через прокси (передавать GetCurrencty ссылку на контекст). Результат сохраняет в файлик currency.cache. Типы валют тоже легко изменяются:

    PHP:
    $usd $this->xml->xpath("//Valute[@ID='R01235']/Value");
    $eur $this->xml->xpath("//Valute[@ID='R01239']/Value");
    PHP:
    <?php

        define
    ('USE_PROXY'false);

        class 
    CCurrency {
            private 
    $currency;
            private 
    $xml;
            private 
    $count;

            public function 
    GetCurrency($url$context) {
                if (
    USE_PROXY)
                    
    $this->currency file_get_contents($urlfalse$context);
                else
                    
    $this->currency file_get_contents($url);
            }

            public function 
    ProcessCurrency() {
                if (
    version_compare("5.0.0"phpversion()) <= 0    && class_exists("SimpleXMLElement")) {
                    
    $this->xml = new SimpleXMLElement($this->currency);
                  } else die(
    "Ошибка: для работы функции получения курса валют должна быть установлена версия PHP не ниже 5 и должно быть установлено расширение SimpleXML.");
            }

            public function 
    SaveCurrency() {
                
    $out = array();
                
    $cache fopen("currency.cache""w");
                
    $usd $this->xml->xpath("//Valute[@ID='R01235']/Value");
                
    $eur $this->xml->xpath("//Valute[@ID='R01239']/Value");
                
    $usd = (string) $usd[0]; $eur = (string) $eur[0];
                
    $usd str_replace(".",",",round(str_replace(",",".",$usd),2));
                
    $eur str_replace(".",",",round(str_replace(",",".",$eur),2));
                
    fwrite ($cache$usd ";" $eur);
                
    fclose($cache);
            }
        }
        
        
    $currency = new CCurrency();
        
    $currency->GetCurrency("http://www.cbr.ru/scripts/XML_daily.asp"$proxy);
        
    $currency->ProcessCurrency();
        
    $currency->SaveCurrency();

    ?>
     
    BFox и Slayter нравится это.
  2. Slayter

    Slayter

    Регистр.:
    8 апр 2006
    Сообщения:
    232
    Симпатии:
    52
    Блин, я подобные задачи всегда решал регулярками, до работы с DOM ч-з php, так же как и до XML с XPath руки не доходили. и, как оказывается, зря :( Спасибо за подсказанный метод :)

    Но замечаний пара есть:
    * php парсит документ перед обработкой построчно, и, если версия php < 5 он даже не доберётся до самой проверки (private $currency; вызовет ошибку уровня парс_еррор, в случае четвёрки)
    * die не стоит использовать. Если не может отработать один компонент системы -- не стоит прекращать её работу.
    * нет примера использования контектста
    PHP:
    $context = array(
        
    'http' => array(
            
    'proxy' => 'tcp://127.0.0.1:8080',
            
    'request_fulluri' => true,
            ),
        );
    $context stream_context_create($context);
    $url '';
    $currency = new CCurrency();
    $currency->getCurrency($url$context);
    $currency->processCurrency();
    $currency->saveCurrency();
    + советую сделать chaining :) что бы вызывать можно было как $currency->getCurrency($url, $context)->process()->save();
    + советую у методово процесс и сэйв убрать постфикс Currency. ясно же понятно, к какому классу они относятся, просто писать больше
    + сделать обёртку для использования прокси
     
  3. pixelranger

    pixelranger

    Регистр.:
    24 июн 2006
    Сообщения:
    386
    Симпатии:
    117
    Вот прикладываю парсер курса валют на вчера, сегодня и завтра. у программиста кривые руки, регулярные выражения не использовал. может кому пригодится)
    Второй архив с регулярными выражениями, заставлял его переделывать, но все так и не работает как должно.
     

    Вложения:

    • curs_parser.rar
      Размер файла:
      1,1 КБ
      Просмотров:
      58
    • parser.rar
      Размер файла:
      451 байт
      Просмотров:
      39
    UDAV, AlexAntre, WaterSpirit и 2 другим нравится это.
  4. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    350
    К стати это я :D:D
    И я помню что в личке давненько отписывал что сделаю нормальный скрипт но увы времени нет...

    А вобще не нужно тут так все иронизировать ! Не о каком кешеировании тогда речи не шло ! Да сделал на другой сайт НО ОН ДОСИХПОР РАБОТАЕТ !

    Ну а в опровдание могу сказать что был молодой и не опытный;)
     
  5. Muntik

    Muntik

    Регистр.:
    3 июн 2008
    Сообщения:
    451
    Симпатии:
    87

    PHP:
    <?php 

      
    // Получаем текущие курсы валют в rss-формате с сайта www.cbr.ru 

      
    $content get_content(); 

      
    // Разбираем содержимое, при помощи регулярных выражений 

      
    $pattern "#<Valute ID=\"([^\"]+)[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>([^<]+)#i"

      
    preg_match_all($pattern$content$outPREG_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.cbr.ru/scripts/XML_daily.asp?date_req=$date"

        
    // Загружаем HTML-страницу 

        
    $fd fopen($link"r"); 

        
    $text=""

        if (!
    $fd) echo "Запрашиваемая страница не найдена"

        else 

        { 

          
    // Чтение содержимого файла в переменную $text 

          
    while (!feof ($fd)) $text .= fgets($fd4096); 

        } 
     
    // Закрыть открытый файловый дескриптор 

        
    fclose ($fd); 

        return 
    $text

      } 

    ?>
     
    UDAV нравится это.
Статус темы:
Закрыта.