Вытащить цену из текста

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

Статус темы:
Закрыта.
Модераторы: xpert13
  1. smertnik

    smertnik Постоялец

    Регистр.:
    5 июн 2006
    Сообщения:
    68
    Симпатии:
    30
    Здравствуйте.

    Помогите с регулярным выражением для следующего текста:
    Код:
    Начальная (максимальная) цена контракта (лота):1. приобретение оргтехники для районных (городских) судов Чеченской Республики.    468000.00 руб.
    <td>Способ размещения заказа: Запрос котировокГод финансирования: 2008Организатор торгов:Наименование: Управление Судебного депратамента при Верховном Суде Российской Федерации  в Чеченской РеспубликеКонтактная информация:Телефон: (8712) 22 46 93,(8712) 22 34 99,(8712) 22-46-93,(8712) 22-34-99,Контактное лицо: Мачаев Хумид ВиситовичИсточник финансирования: Федеральный бюджетСведения о включенных (невключенных) в цену товаров, работ, услуг расходах, в том числе расходах на перевозку, страхование, уплату таможенных пошлин, налогов, сборов и других обязательных платежей: приобретение оргтехники для районных (городских) судов Чеченской Республики.Место и вид подачи котировочных заявок: Российская Федерация, 364016, Грозный, Алексеева, 160Дата и время окончания срока подачи котировочных заявок (время местное): 25.08.2008 0:00:00Cрок и условия оплаты поставок товаров, выполнения работ, оказания услуг: Безналичный расчет, не позднее 10 рабочих дней с момента подписания акта сдачи-приемки выполненных работ.Cрок подписания победителем государственного контракта со дня подписания протокола рассмотрения и оценки котировочных заявок: не позднее 10 дней со дня подписания протокола рассмотрения и оценки котировочных заявокЗаказчик: Управление Судебного депратамента при Верховном Суде Российской Федерации  в Чеченской РеспубликеАдрес заказчика: Российская Федерация, 364016, Грозный, Алексеева, 160Контактные реквизиты заказчика: (8712) 22-46-92, (8712) 22-34-99Адрес электронной почты: usd_01@mail.ruКонтактная информация:Телефон: (8712) 22 46 93,(8712) 22 34 99,(8712) 22-46-93,(8712) 22-34-99,Контактное лицо: Нагаев Бислан Харонович (8712) 22-46-93Иная информация: Дополнительная информация находится в приложенном файле</td>
    Из него нужно вытащить цену - (468000.00) руб. Но перед ценой может быть какой угодно текс, привязаться не выйдет, искать как цифры не выходит, т.к в тексте телефоны и.т.д встречаются. Единственное что после цены идет тип валюты (.руб)
     
  2. Kaimi

    Kaimi

    Регистр.:
    28 окт 2007
    Сообщения:
    257
    Симпатии:
    253
    Попробуй так
    /\s(\d+)\.(\d+)\sруб/
     
    Piflit нравится это.
  3. Gragdanin

    Gragdanin Создатель

    Регистр.:
    11 авг 2008
    Сообщения:
    12
    Симпатии:
    0
    Сори, что влез... топы пока не могу создавать.
    Нужна помощь...
    есть ячейка, где надо накрутить сумму (333)

    <td class="price incaritem"> 333 <span class="ages">USD.</span></td>

    делаю так
    Код:
    <script language="JavaScript">
      $RetrieveFile = '<td class="price incaritem">
                       333 <span class="ages">USD.</span>';
      $pattern = '#<td class="price incaritem">(.+)<span class="ages">(.+)</span>#iseU';
      $replacement = "'<td>'.(str_replace(' ', '', '$1') + 1000).'</td>'";
      $RetrieveFile = preg_replace($pattern, 
                                   $replacement, 
                                   $RetrieveFile);
      echo $RetrieveFile;
    </script>
    
    не хочет менять... Что сделано не так?
    Корректно ли составлен скрипт?
     
  4. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Это у тебя вообще что такое? Если ПХП тогда почему
    language="JavaScript"
     
  5. Gragdanin

    Gragdanin Создатель

    Регистр.:
    11 авг 2008
    Сообщения:
    12
    Симпатии:
    0
    Вытащил код откуда-то... php конечно же...
    И ввиду "особой одаренности", решил, что если обозвать это дело language="JavaScript" , то оно так и поплывет.

    Буду очень благодарен, если кто поправит/напишет скрипт под задачу...
    ( а задача, на сграбленной странице прайсов, накручивать определенную в скрипте сумму к ценам)
     
  6. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Кажется понял, небходимо добавить USD, так? Вот исправленный код:
    PHP:
    <script language="php">
      
    $RetrieveFile '<td class="price incaritem">
                       333 <span class="ages">USD.</span>'
    ;
      
    $pattern '#<td class="price incaritem">(.+)<span class="ages">(.+)</span>#iseU';
      
    $replacement "'<td>'.($1+1000).'<span class=\"ages\">$2</span>'";
      
    $RetrieveFile preg_replace($pattern
                                   
    $replacement
                                   
    $RetrieveFile);
      echo 
    $RetrieveFile;
    </script>
    У тебя в строке '$replacement =' две ошибки во первых $2 нету, соответственно USD не скопируется, во вторых <td> добавлен, хотя регулярка его не захватывает. Кроме того, str_replace там нафиг не нужен, хотя правильность результата не портит.
     
  7. Gragdanin

    Gragdanin Создатель

    Регистр.:
    11 авг 2008
    Сообщения:
    12
    Симпатии:
    0
    спасибо, RolCom.
    Подставил код ... но почему-то не хочет менять :( попрежнему.

    Вроде все с виду должно работать.. но выводит в броузере те же 333
    Код:
    <html>
    <body>
    <td class="price incaritem"> 333 <span class="ages">USD.</span></td>
    
    <script language="php">
      $RetrieveFile = '<td class="price incaritem">
                       333 <span class="ages">USD.</span>';
      $pattern = '#<td class="price incaritem">(.+)<span class="ages">(.+)</span>#iseU';
      $replacement = "'<td>'.($1+1000).'<span class=\"ages\">$2</span>'";
      $RetrieveFile = preg_replace($pattern, 
                                   $replacement, 
                                   $RetrieveFile);
      echo $RetrieveFile;
    </script>  
    </body>
    </html>
     
  8. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Естественно, в преведенном выше коде он сначала выводит
    Код:
    <td class="price incaritem"> 333 <span class="ages">USD.</span></td>
    
    А после него нужный результат.
    ПХП скрипт обрабатывает только то, что в строке:
    Код:
     $RetrieveFile = '<td class="price incaritem">
    333 <span class="ages">USD.</span>';
    
    З.Ы. и регулярка неверная, ток щас заметил, короче правильный вариант:
    PHP:
    <script language="php">
      
    $RetrieveFile = <<<EOF
    <td class="price incaritem"> 333 <span class="ages">USD.</span></td>
    <td class="price incaritem"> 22 <span class="ages">EUR.</span></td>
    <td class="price incaritem"> 44 <span class="ages">EUR.</span></td>
    EOF;
      
    $pattern '#<td class="price incaritem">(.+?)<span class="ages">(.+?)</span>#ise';
      
    $replacement "'<td>'.($1+1000).' <span class=\"ages\">$2</span>'";
      
    $RetrieveFile preg_replace($pattern
                                   
    $replacement
                                   
    $RetrieveFile);               
      echo 
    $RetrieveFile;
    </script>
     
    Gragdanin нравится это.
  9. Gragdanin

    Gragdanin Создатель

    Регистр.:
    11 авг 2008
    Сообщения:
    12
    Симпатии:
    0
    Благодарю, RolCom.
    Снова нужна помощь.
    на странице имеются следующие строки:
    Код:
    <div class="RowNoLink">
    <span class="RowText">
    			ID item 40-42-08 5177
    			</span>
    		</div>
    		<br />
    		<div class="RowNoLink">
    			<span class="RowText">
    			<strong> £ 43.95* B</strong>
    			</span>
    		</div>
    <div class="RowNoLink">
    <span class="RowText">
    			ID item 40-42-08 5178
    			</span>
    		</div>
    		<br />
    		<div class="RowNoLink">
    			<span class="RowText">
    			<strong> £ 55.04* B</strong>
    			</span>
    		</div>
    
    НЕобходимо вытащить цену только с определенного ID item в данном случае с ID item 40-42-08 5177
    Как составить регулярку в этом случае?
    (нужен глобальный, многострочный поиск? )
     
  10. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Код:
    (?xi)
    <div\s+class\s*=\s*"RowNoLink"\s*>\s*
    <span\s+class\s*=\s*"RowText"\s*>\s*
        ID\s+item\s+ 40-42-08\s+5178
    \s*</span>
    \s*</div>
    \s*<br\s+/>\s*
    
    <div\s+class\s*=\s*"RowNoLink"\s*>\s*
    <span\s+class\s*=\s*"RowText"\s*>\s*
       <strong>[^<\d]*(\d+(?:\.\d\d)?)[^<]*</strong>
    \s*</span>
    \s*</div>
    
    Вместо '40-42-08' и '5178' подставить свое значение.
    Между <strong> и </strong> регулярка ищет совпадения с чилом формата напр. XXXXX или XXXX.XX(первые X-ы в любом количестве>0), вокруг числа могут быть произвольные символы.
    Теги <strong>, </strong>, </span>, </div> как видишь, ищутся как есть, с точным совпадением.
     
    Gragdanin нравится это.
Статус темы:
Закрыта.