За последние 24 часа нас посетили 106220 программистов и 5631 робот. Сейчас ищут 2459 программистов ...

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

Тема в разделе "Регулярные выражения", создана пользователем Demon, 9 янв 2008.

  1. Demon

    Demon Активный пользователь

    С нами с:
    20 апр 2006
    Сообщения:
    239
    Симпатии:
    0
    Подскажите пожалуйста, почему не работает регулярка?..
    Надо достать данные, находяшиеся между двумя тегами.
    Пример
    HTML:
    1. <font color=#aeaeae>1116.88</font>
    Регулярку такую написал:
    Код (Text):
    1.  
    2. "/(?=<font color=#aeaeae>)*\d+.\d+(?=<\/font>)/"
    Выдается ошибка - Compilation failed: nothing to repeat at offset
    В чем проблема?
     
  2. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    7.983
    Симпатии:
    1
    Адрес:
    Оттуда
    PHP:
    1.  
    2. <?php
    3.  
    4. # 440hz zone
    5.  
    6. $text = '<font color=#aeaeae>1116.88</font>';
    7. $pat  = '/<font color=#aeaeae>(\d+\.\d+)<\/font>/i';
    8.  
    9. if(preg_match_all($pat,$text,$matches)) {
    10.  
    11.         print_r($matches);
    12.  
    13. }
    14.  
    15. ?>
    16.  
    Код (Text):
    1.  
    2. hosting(440hz):~/tmp$>php -q reg.php
    3. Array
    4. (
    5.     [0] => Array
    6.         (
    7.             [0] => <font color=#aeaeae>1116.88</font>
    8.         )
    9.  
    10.     [1] => Array
    11.         (
    12.             [0] => 1116.88
    13.         )
    14.  
    15. )
     
  3. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    7.983
    Симпатии:
    1
    Адрес:
    Оттуда
    в кривых руках. в чем же еще?
    =)
     
  4. Demon

    Demon Активный пользователь

    С нами с:
    20 апр 2006
    Сообщения:
    239
    Симпатии:
    0
    Почему тогда так не работает?
    PHP:
    1.  
    2. <?
    3. $matches = preg_match_all("/<font color=#aeaeae>(\d+\.\d+)<\/font>/i", file_get_contents('http://cbr.ru'), $array, PREG_PATTERN_ORDER);
    4. print_r($array);
    5. ?>
    6.  
     
  5. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    7.983
    Симпатии:
    1
    Адрес:
    Оттуда
    потому что там нету тега <font
     
  6. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    потому что экранировать надо
     
  7. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    7.983
    Симпатии:
    1
    Адрес:
    Оттуда
    ты о чем вообще?
     
  8. Demon

    Demon Активный пользователь

    С нами с:
    20 апр 2006
    Сообщения:
    239
    Симпатии:
    0
    Есть.. и много...
     
  9. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    7.983
    Симпатии:
    1
    Адрес:
    Оттуда
    не надо тут мне ЛЯЛЯ...

    Код (Text):
    1.  
    2. hosting(root):/usr/home/440hz#>curl -s "http://cbr.ru" | grep color
    3.                 <td width="100%" bgcolor="#4b5b65"><img src="/images/temp.gif" width="1" height="1"></td>
    4.                 <td width="100%" bgcolor="#4b5b65"><img src="/images/temp.gif" width="1" height="1"></td>
    5.                 <td width="100%" bgcolor="#4b5b65"><img src="/images/temp.gif" width="1" height="1"></td>
    6.                 <td width="100%" bgcolor="#4b5b65"><img src="/images/temp.gif" width="1" height="1"></td>
    7.                 <td width="100%" bgcolor="#4b5b65"><img src="/images/temp.gif" width="1" height="1"></td>
    8.                 <td width="100%" bgcolor="#4b5b65"><img src="/images/temp.gif" width="1" height="1"></td>
    9.                 <td width="100%" bgcolor="#4b5b65"><img src="/images/temp.gif" width="1" height="1"></td>
    10.                 <td width="100%" bgcolor="#4b5b65"><img src="/images/temp.gif" width="1" height="1"></td>
    11.                 <td width="100%" bgcolor="#4b5b65"><img src="/images/temp.gif" width="1" height="1"></td>
    12.                 <td bgcolor="#d5d9db" valign="top"><img src="/images/temp.gif" width="5" height="1"></td>
    13.                 <td height="1" bgcolor="#4b5b65" colspan="3"><img src="/images/temp.gif" width="1" height="1"></td>
    14. hosting(root):/usr/home/440hz#>curl -s "http://cbr.ru" | grep font
    15. hosting(root):/usr/home/440hz#>
    видно что тегов font НЕТУ,

    а если ты хочешь таскать данные из левой колонки, то они java генератся как пить дать.
     
  10. Demon

    Demon Активный пользователь

    С нами с:
    20 апр 2006
    Сообщения:
    239
    Симпатии:
    0
    Хмм..сегодня днем тэги были.. мда. Извиняюсь.
    Каждый раз по-разному?.. :roll:
     
  11. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    7.983
    Симпатии:
    1
    Адрес:
    Оттуда
    воровать вообще нехорошо.
     
  12. Demon

    Demon Активный пользователь

    С нами с:
    20 апр 2006
    Сообщения:
    239
    Симпатии:
    0
    Так а где мне еще взять курсы валют (просто цифры, не информеры)?..
     
  13. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    7.983
    Симпатии:
    1
    Адрес:
    Оттуда
    ну как где? поискать в инете...
    но не воровать же?
     
  14. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    7.983
    Симпатии:
    1
    Адрес:
    Оттуда
    5 минут поиска в инете... "кукрсы валют RSS"

    PHP:
    1. <?php
    2.  
    3. // 2008 (c) 440hz
    4. // получить курсы валют
    5.  
    6. $url = 'http://rss.sampo.ru/rss.php?mode=kurs';
    7. $html = file_get_contents($url);
    8.  
    9. if($html === false) {
    10.     print("Не могу получить страницу [{$url}]");
    11.     exit();
    12. }
    13.  
    14. $pat = '/<tr><td>(.*)<\/td><td>(.*)<\/td><\/tr>/Ui';
    15.  
    16. if(preg_match_all($pat,$html,$match)) {
    17.  
    18.     foreach($match[1] as $key => $name) {
    19.         $name = str_replace('&nbsp;','',$name);
    20.         $val = $match[2][$key];
    21.         print("[$name] - [$val]");
    22.         print("\n");
    23.     }
    24.  
    25.  
    26. }
    27.  
    28. ?>
    Код (Text):
    1. hosting(root):/usr/home/440hz/tmp#>php kurs.php
    2. [Австралийский доллар] - [21,5246]
    3. [Фунт стерлингов Соединенного Королевства] - [49,0114]
    4. [Белорусских рублей] - [11,3897]
    5. [Датских крон] - [48,4710]
    6. [Доллар США] - [24,5462]
    7. [Евро] - [35,9332]
    8. [Исландских крон] - [39,2865]
    9. [Казахских тенге] - [20,3492]
    10. [Канадский доллар] - [25,0038]
    11. [Китайских юаней Жэньминьби] - [33,6038]
    12. [Норвежских крон] - [45,3971]
    13. [СДР] - [38,7457]
    14. [Сингапурский доллар] - [16,9694]
    15. [Новая турецкая лира] - [20,9367]
    16. [Украинских гривен] - [48,2357]
    17. [Шведских крон] - [38,3379]
    18. [Швейцарский франк] - [21,7879]
    19. [Японских йен] - [21,8441]
    p.s. и кто теперь папочка? =)
     
  15. Anonymous

    Anonymous Guest

    Тру папко
     
  16. Clone

    Clone Guest

  17. HeeL

    HeeL Активный пользователь

    С нами с:
    6 дек 2007
    Сообщения:
    6
    Симпатии:
    0
    Адрес:
    Kiev
    Demon, а у меня твоя регулярка работает правильно :)

    Кроме что выделить цифры забыл (\d+.\d+)
     
  18. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    797
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    По поводу http://cbr.ru
    Пару часов назад делал:
    http://www.specialist.ru/news/Publicati ... vices.aspx
    там уже готовый класс есть. Единственное условие - надо просить хостера включить поддержку soap.
    В принципе сделал за 15 минут, вместе с чтением статьи и обсуждением с заказчиком, в каком виде ему это нужно.
     
  19. Demon

    Demon Активный пользователь

    С нами с:
    20 апр 2006
    Сообщения:
    239
    Симпатии:
    0
    Нифига себе.. Зачем так все усложнять?..
     
  20. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    797
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    Зато быстро. Доширак - 5 минут и готов скрипт.
     
  21. Demon

    Demon Активный пользователь

    С нами с:
    20 апр 2006
    Сообщения:
    239
    Симпатии:
    0
    Можно так же быстро составить нужную регулярку, используя удобный конструктор - http://www.pcre.ru/eval/
    :wink:
     
  22. mlevel

    mlevel Активный пользователь

    С нами с:
    1 янв 2009
    Сообщения:
    11
    Симпатии:
    0
    И снова эти курси валют ....

    Хотел получить курси валют с данного сайта - http://tables.finance.ua/ru/currency/official
    Никак не получаеться. Вот мой код:
    PHP:
    1.  
    2. $html = "";
    3. $pattern = '/<td align="center">(.*)<\/td><td align="center">(.*)<\/td><td>(.*)<\/td><td align="left">(.*)<\/td><td nowrap="nowrap">(.*)<\/td><td nowrap="nowrap">(.*)<\/td><td nowrap="nowrap">(.*)<\/td>/i';
    4. $html .= file_get_contents("http://tables.finance.ua/ua/currency/official");
    5.    foreach($fin_array as $name) {
    6.           $val1 = $name[1];
    7.           $val2 = $name[2];
    8.           $val3 = $name[3];
    9.           $val4 = $name[4];
    10.           $val5 = $name[5];
    11.           $val5 = $name[6];
    12.           $val5 = $name[7];
    13.           print_r($fin_array);
    14.           print("[$val1] - [$val2] - [$val3] - [$val4] - [$val5] - [$val6] - [$val7]");
    15.           print("<br>");
    16.       }
    17.  
    Помогите пожалуйста, очень прошу ..... Заранее благодарен.
     
  23. Frozen

    Frozen Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    540
    Симпатии:
    0
    Адрес:
    Москва
    $pattern = '/<td align="center">(.*)<\/td><td align="center">(.*)<\/td><td>(.*)<\/td><td align="left">(.*)<\/td><td nowrap="nowrap">(.*)<\/td><td nowrap="nowrap">(.*)<\/td><td nowrap="nowrap">(.*)<\/td>/is';

    может так...
     
  24. mlevel

    mlevel Активный пользователь

    С нами с:
    1 янв 2009
    Сообщения:
    11
    Симпатии:
    0
    Пустой массив виводит.
     
  25. mlevel

    mlevel Активный пользователь

    С нами с:
    1 янв 2009
    Сообщения:
    11
    Симпатии:
    0
    Вот пример строки для парсинга(елементи которие нужно полусить в массив виделени жирним):

    P.S. Может проблема в том что подстроки которие ожидаються к виводу содержат HTML теги?