Модераторы: ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск строки в тексте, Нужна помощь 
:(
    Опции темы
flame33
  Дата 14.12.2010, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 14.12.2010

Репутация: нет
Всего: нет



Здравствуйте! Очень нужна помощь.
В какой-то части кода, который я приложил, программа ищет строку с помощью регулярного выражения, такого вида: "1|Rexton 2.7 Xdi M/T Original|1|1 049 000 |ABS (Антиблокировочная тормозная система)<br>". Выбирает от туда "1 049 000" и дописывает валюту (руб.). После получается 1049000 руб. Что нужно изменить, чтобы получалось "1 049 000 руб". (т.е. с сохранением пробелов)?
Код

elsif($act eq 'price_from'){
    
    rdb::New('item',"$SET{modpath}/data/catalog/items/$cid->{cid}.ldt",'item');      
    rdb::Open('item');
    local @items=rdb::GetAll('item');
    rdb::Close('item');
    
    foreach(@items){
     $nn++;
     
     if($_->{show} eq '1'){

        my $price=$_->{price};
        $price=~s/\s|\.|\,|\D//g;
     
        if($price*1 < $PRICE_FROM*1){
          $PRICE_FROM=$price*1;
          $PRICE_FROM_TYPE=$_->{pricetype};
      }
     }
    }
}
else{   my $out='';

    local $titem=&FUNC::templates::Get('list',$titem);
    local $titemsel=&FUNC::templates::Get('list',$titemsel); 

    rdb::New('item',"$SET{modpath}/data/catalog/items/$cid->{cid}.ldt",'item');      
    rdb::Open('item');
    local @items=rdb::GetAll('item');
    rdb::Close('item');
    
    local $items='';
    local $buf='';
    my $nn=0;
    
    my @cids=split("_",$cid->{cid});
    $ccid=join("_",@cids[0..$#cids-1]);
    $ncid=$cids[$#cids];
    
    foreach(@items){
     $nn++;
     
if($_->{show} eq '1'){

      if($cid->{selid} eq $_->{id} && $cid->{selcid} eq $cid->{cid}){
         $buf=$titemsel;
      }
      else{
         $buf=$titem;
      }    

          $buf=~s/\[templ\((.+?)\)\]/&FUNC::templates::Get('other',$1)/gie;
          $buf=~s/\[itemfield>(.+?)\]/$_->{$1}/ge;
           
     #foreach(1..2){
    $buf=~s/\[itemfield>(.+?)(\((.*?)\)\((.*?)\)|)\]/&site_process_field($_->{$1},$3,$4)/ge;
     #}    
        my $price=$_->{price};
        $price=~s/\s|\.|\,|\D//g;
     
        if($price*1 < $PRICE_FROM*1){
          $PRICE_FROM=$price*1;
          $PRICE_FROM_TYPE=$_->{pricetype};
      }
       
         
        $buf=~s/\[title\]/$_->{title}/gie;
        $buf=~s/\[cid\]/$ncid/gie;
        $buf=~s/\[fullcid\]/$ccid/gie;
        $buf=~s/\[id\]/$_->{id}/gie;
        $buf=~s/\[itemfield_price>(.+?)\((.+?)\)\((.+?)\)\]/&site_money($sets{'money_main'},$2,$_->{$1},$3)/ge;
        $buf=~s/\[link>add2basket\]/qq($SET{url}&d=add2basket&cid=$cid->{cid}&id=$_->{id})/ge;

        $buf=~s/\[isend\((.+?)\)\((.+?)\)\]/$nn == $#items+1?$1:$2/gie;
        
        

        $out.=$buf;
     }
     
    
    }
return $out;
}

PM MAIL   Вверх
Jimy
Дата 14.12.2010, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 4.7.2010

Репутация: нет
Всего: 3



Из кода однозначно не ясно, возможно, в подпрограмме "site_money".

PM   Вверх
flame33
Дата 14.12.2010, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 14.12.2010

Репутация: нет
Всего: нет



Цена ("1 049 000") точно обозначается как price. site_money это скорее руб., т.е. валюта. Ничего не понимаю в рег.выражениях, и подправить не могу.
PM MAIL   Вверх
alezzz
Дата 14.12.2010, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 11
Всего: 14



13 и 59 строки кода:
Код

my $price=$_->{price};
$price=~s/\s|\.|\,|\D//g;


В переменной $price все точки, запятые, нецифры и пробелы (там-же табуляция, переход строки и т.д.) заменяются ничем, т.е. удаляются. Попробуйте убрать из выражения \s.
PM MAIL   Вверх
flame33
Дата 15.12.2010, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 14.12.2010

Репутация: нет
Всего: нет



Нет, к сожалению, это не помогло. Вставил 
Код
$price=~s/|\.|\,|\D//g;
, ничего не изменилось. Может есть еще какие-то варианты?

Это сообщение отредактировал(а) flame33 - 15.12.2010, 09:57
PM MAIL   Вверх
alezzz
Дата 15.12.2010, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


Профиль
Группа: Участник
Сообщений: 499
Регистрация: 17.8.2009

Репутация: 11
Всего: 14



Да, так не работает, простите не проверил. Нужно убрать не только \s но и \D.

Код

$price=~s/\.|\,//g;


Но тогда есть шанс что попадут левые символы, например буквы.

Можно заменить на строку:
Код

$price=~s/[^ \d]//g;


Будет удалять все кроме пробелов и цифр (!!! между "^"  и "\d" пробел, хотя не думаю что между цифрами появится перевод строки или табуляция). Но число останется с теми пробелами с какими было, т. е. если ошибутся и напишут "10 49 000", то так и останется.

Но мне кажется что если не удалять пробелы, то позже появятся другие проблемы:
Код

$price="1 049 000";
$price=~s/[^ \d]//g;
$price=$price*1;
print $price;

Вывод:
Код

1


А у вас в коде есть такое:
Код

if($price*1 < $PRICE_FROM*1)

Тут $price станет равно 1. Нужно что-то менять только когда уже не будет никаких математических операций на $price

Это сообщение отредактировал(а) alezzz - 15.12.2010, 14:10
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Регулярные выражения | Следующая тема »


 




[ Время генерации скрипта: 0.0923 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.