вытащить текст по критериям

И всё прочее, что касается HTML
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

вытащить текст по критериям

Непрочитанное сообщение ProFTP » 2009-12-25 20:06:51

что-то я туплю

хотел решить элементарную задачу

нужно обработать регулрным выражением 2 строки

есть 2 возможных варианта:

$hhh = 'wiki/999/44/page_co/11';

$hhh = 'wiki/999/1/page_co/11';

(цифры для примера, т.е. цифры для примера, я так понимаю (\d+))

почему данный код не работает?

Код: Выделить всё

$hhh = 'wiki/999/page_co/11';

# $hhh = 'wiki/999/page_co/11';

print $hhh =~ /^wiki\/(\d+)(?:\/(\d+))\/page_co\/(\d+)$/;

print $1.'  '.$2.'   '.$3;


мне казалось что очевидно дожно работать, но не работает....
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Гость
проходил мимо

Re: вытащить текст по критериям

Непрочитанное сообщение Гость » 2009-12-26 2:50:22

Как я понял из манов по перлу: (?:regex) - говорит, что не нужно то, что совпало записывать в переменную $1(или там 2,3...).
То есть вот эта конструкция:

Код: Выделить всё

$hhh =~ /^wiki\/(\d+)(?:\/(\d+))\/page_co\/(\d+)$/;
                            $1            $2                       $3
эквивалентна

Код: Выделить всё

$hhh =~ /^wiki\/(\d+)(\/(\d+))\/page_co\/(\d+)$/;
                             $1  $2  $3                      $4
только отличается лишь тем, что во второй используется $1 $2 $3 и $4.
То есть, чтобы оно работало надо после (?:regex) поставить ? или *(ну или {...}).

У меня с такой вот штукой:

Код: Выделить всё

$hhh =~ /^wiki\/(\d+)(?:\/(\d+))?\/page_co\/(\d+)$/;
выводится с $hhh = 'wiki/999/page_co/11';

Код: Выделить всё

         Use of uninitialized value in concatenation (.) or string at ./1.pl line 8.
         999      11
а с $hhh = 'wiki/999/1/page_co/11';

Код: Выделить всё

         999   1   11
Не знаю то ли это или не то, но может поможет...

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: вытащить текст по критериям

Непрочитанное сообщение zg » 2009-12-26 9:04:47

ProFTP писал(а):/^wiki\/(\d+)(?:\/(\d+))\/page_co\/(\d+)$/;
а не проще по слешам разбить? :roll: и из массива взять нужные занчения

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: вытащить текст по критериям

Непрочитанное сообщение ProFTP » 2009-12-26 14:02:15

Гость писал(а): То есть, чтобы оно работало надо после (?:regex) поставить ? или *(ну или {...}).

да, спасибо, забыл отписатся, нашел что со всем забыл про "знак вопроса", число совпадений...

мне приходилось только или парсить и вытаскивать, или искать, или заменять всегда....

я делал только то что мне надо было, надо будет какие-то практически задачки порешать, чтобы знать, чтоли...?
хотя, в perl5.10 очень много всего добавили...

zg писал(а):
ProFTP писал(а):/^wiki\/(\d+)(?:\/(\d+))\/page_co\/(\d+)$/;
а не проще по слешам разбить? :roll: и из массива взять нужные занчения
лучше, но тут надо написать регулярное выражение в атрибут метода класса (чтобы данный метод загрузился когда идет такая url в событиях во фремворке Catalyst), там именно так и сделано, оно идет потом в массив... @$c->req->captures

вроде бы работает

Код: Выделить всё

sub wiki_page_co : Regex('^wiki\/(\d+)(?:\/(\d+))?\/page_co\/(\d+)$')  { 
        my ( $self, $c ) = @_;
      
      $c->stash->{ page_co } = 1;

# use Data::Dumper;
# print Dumper($c->req->captures);
# print $c->req->captures->[2] if (!$c->req->captures->[1]);
      
    $c->forward( 'wiki', [ !$c->req->captures->[1] 
    							? $c->req->captures->[0]
    							: @{$c->req->captures}[0..2] ] );
    
 }

Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение