Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > поиск значения в телe запроса


Автор: ImSave 12.11.2009, 16:19
в переменной $request содержится тело запроса от браузера, например:
Код

User-Agent: OUser-Agent: Opera/9.51 (Windows NT 6.0; U; MRA 5.4 (build 02620); ru)
Host: cbuilder.ru
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
....
Accept-Flags: flaf1, flag2;
...

нужно проверить существование в этом запросе поля Accept-Flags: и если да, то проверить есть ли в нем flag3 допустим. 

Спасибо заранее.

забыл... и после проверки удалить эту строку из $request.

Автор: arto 12.11.2009, 17:42
s#^Accept-Flags: .*flag2.*$##m && print "deleted";

Автор: ImSave 12.11.2009, 19:33
Цитата(arto @ 12.11.2009,  17:42)
s#^Accept-Flags: .*flag2.*$##m && print "deleted";

так??:
Код

if($request = s#^Accept-Flags: .*flag2.*$##m){
  #ок!
}

прошу прощения, но не могли бы вы расписать по подробнее. типа:
Код

if(поиск Accept-Flags:){
    #нашли
    if(поиск значения flag3){
      #ок!
    }
#удаляем всю строку
}

Автор: krypt3r 13.11.2009, 06:43
Попробуйте так
Код

if ($request =~ /Accept\-Flags:\s*(.+?)\n/ and $1 =~ /flag3/) {
  # OK
}

Автор: ImSave 14.11.2009, 23:58
Цитата(arto @ 12.11.2009,  17:42)
s#^Accept-Flags: .*flag2.*$##m && print "deleted";

чет не срабатывает =(

Добавлено через 1 минуту и 16 секунд
Цитата(krypt3r @ 13.11.2009,  06:43)
Попробуйте так
Код

if ($request =~ /Accept\-Flags:\s*(.+?)\n/ and $1 =~ /flag3/) {
  # OK
}

Спасибо. работает так:
Код

if ($request->as_string =~ /Accept\-Flags:\s*(.+?)\n/ and $1 =~ /flag3/) {
 #ok
}


теперь как удалить всю эту строчку?

Автор: arto 15.11.2009, 00:13
# print -l User-Agent:\ Opera/9.51\ \(Windows\ NT\ 6.0\;\ U\;\ MRA\ 5.4\ \(build\ 02620\)\;\ ru\) Host:\ cbuilder.ru Accept:\ text/html,\ application/xml\;q=0.9,\ application/xhtml+xml,\ image/png,\ image/jpeg,\ image/gif,\ image/x-xbitmap,\ \*/\*\;q=0.1 Accept-Language:\ ru-RU,ru\;q=0.9,en\;q=0.8 Accept-Charset:\ iso-8859-1,\ utf-8,\ utf-16,\ \*\;q=0.1 .... Accept-Flags:\ flaf1,\ flag2\; ... | perl -0777 -plne 's#^Accept-Flags: .*flag2.*$##m && print "deleted"; '
deleted
User-Agent: Opera/9.51 (Windows NT 6.0; U; MRA 5.4 (build 02620); ru)
Host: cbuilder.ru
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
....

...

Автор: ImSave 15.11.2009, 00:18
Извиняюсь конечно..но я не понимаю как это применить...куча текста и что к чему?

Автор: arto 15.11.2009, 00:57
если вы захотите, то сможете разобраться.

Автор: ImSave 15.11.2009, 12:55
Цитата(arto @ 15.11.2009,  00:57)
если вы захотите, то сможете разобраться.

да. вы правы. Спасибо за старания!=)

Добавлено @ 13:01
Цитата(krypt3r @ 13.11.2009,  06:43)
Попробуйте так
Код

if ($request =~ /Accept\-Flags:\s*(.+?)\n/ and $1 =~ /flag3/) {
  # OK
}

строка в теле запроса выглядит так: 
Код

Accept-Flags: flag1, flag2, flag3

далее пишу:
Код

if ($request->as_string =~ /Accept\-Flags:\s*(.+?)\n/){
  # ok. Accept-Flags found
  if($1 =~ /flag1/){print "->flag1 found\n";}
  if($1 =~ /flag2/){print "->flag2 found\n";}
  if($1 =~ /flag3/){print "->flag3 found\n";}
}

но получаю только:
Код

->flas1 found

т.е. только первый находит, а должен все. Что подправить?

Автор: amg 15.11.2009, 14:26
Цитата(ImSave @  15.11.2009,  12:55 Найти цитируемый пост)
т.е. только первый находит, а должен все. Что подправить?
Переменные $1, $2, ... ресетятся после каждого удачно сработавшего регулярного выражения. Потому так и получается. Исправить можно так:
Код
if ($request->as_string =~ /Accept-Flags:\s*(.+?)\n/){
  my $flags = $1; # ok. Accept-Flags found
  if($flags =~ /flag1/){print "->flag1 found\n";}
  if($flags =~ /flag2/){print "->flag2 found\n";}
  if($flags =~ /flag3/){print "->flag3 found\n";}
}

Цитата(ImSave @  14.11.2009,  23:58 Найти цитируемый пост)
теперь как удалить всю эту строчку?
Собственно, arto уже привел решение. В вашем коде первую строку нужно заменить на:
Код
if ($request->as_string =~ s/^Accept-Flags:\s*(.+?)$//ms){


Автор: ImSave 15.11.2009, 21:20
amg, спасибо работает.
А вот с удалением...ну не срабатывает =(((
вот пробую:
Код

if ($request =~ s/^Accept-Flags:\s*(.+?)$//ms){ #если написать $request->as_string то ошибка
  my $flags = $1; # ok. Accept-Flags found
  if($flags =~ /flag1/){print "->flag1 found\n";}
  if($flags =~ /flag2/){print "->flag2 found\n";}
  if($flags =~ /flag3/){print "->flag3 found\n";}
}
print $request->as_string, "\n"; #вижу Accept-Flags:


пробовал и:
Код

if ($request->as_string =~ /Accept-Flags:\s*(.+?)\n/){
  my $flags = $1; # ok. Accept-Flags found
  if($flags =~ /flag1/){print "->flag1 found\n";}
  if($flags =~ /flag2/){print "->flag2 found\n";}
  if($flags =~ /flag3/){print "->flag3 found\n";}
}
$request =~ s/^Accept-Flags:\s*(.+?)$//ms;
print $request->as_string, "\n"; #и снова вижу Accept-Flags:


Автор: krypt3r 16.11.2009, 07:19
Если уж пошла такая пляска, то
Код

if (my ($flags) = $request =~ /Accept-Flags:\s*(.+?)\n/){
  print "->flag1 found" if $flags =~ /flag1/;
  print "->flag2 found" if $flags =~ /flag2/;
  print "->flag3 found" if $flags =~ /flag3/;
}

Вариант удаления 
Код

$request =~ s/^Accept-Flags:\s*(.+?)$//ms;

оставит пустое место между строками
Код

User-Agent: OUser-Agent: Opera/9.51 (Windows NT 6.0; U; MRA 5.4 (build 02620); ru)
Host: cbuilder.ru                                                                 
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1                                                     
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8                                                 
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1                                       
....                                                                                     

Referer: http://google.ru
...                      

Лучше уж
Код

$request =~ s/^Accept-Flags:\s*(.+?)\n//m;

Автор: ImSave 16.11.2009, 12:28
Ребят, всем спасибо за помощь,
но я вот не пойму, только на до мной Perl издевается?!
вот для теста:
Код

print $request->as_string, "\n"; #ок.норм.вижу Accept-Flags:
$request =~ s/^Accept-Flags:\s*(.+?)$//ms; #пытаюсь удалить ее. 
# пробовал и  $request =~ s/^Accept-Flags:\s*(.+?)\n//m;
print $request->as_string, "\n"; #и снова вижу строку Accept-Flags:. Ну не удаляется она и все тут!

что ж такое то smile 

Автор: ginnie 16.11.2009, 12:46
ImSave, $request - это объект HTTP::Request, поэтому, чтобы удалить заголовок, надо использовать

Код

$request->remove_header('Accept-Flags');


т.е.

Код

if ($request->header('Accept-Flags') =~ /flag3/) {
    $request->remove_header('Accept-Flags');
}

Автор: ImSave 16.11.2009, 13:25
ну наконец-то. ginnie, СПАСИБО огромное.  smile   smile   smile 
Вот код который меня устраивает:
Код

if ($request->header('Accept-Flags') =~ /flag1/){ print "->flag1 found\n"};
if ($request->header('Accept-Flags') =~ /flag2/){ print "->flag2 found\n"};
if ($request->header('Accept-Flags') =~ /flag3/){ print "->flag3 found\n"};
$request->remove_header('Accept-Flags');
print $request->as_string, "\n"; #отлично! Удаляет.

и я так понимаю проверку на Accept-Flags вначале можно не делать, поскольку никакого исключения не вылетит?!

Автор: ImSave 16.11.2009, 17:21
Еще вопросик по теме.
Имеем например:
Код

Accept-Flags: km123, flag1, flag2, flag3;

как достать первое значение?
т.е. получить:
Код

my $znach = km123;


Автор: ginnie 16.11.2009, 17:31
Код

my ($znach) = split(/,/, $request->header('Accept-Flags')); 

Автор: ImSave 16.11.2009, 18:02
ginnie, и снова вам ОГРОМНОЕ спасибо!

Автор: ImSave 6.4.2010, 19:09
Здравствуйте.
Не буду создавать тему. Вопрос:


как в $request сделать замену, т.е. допустим 'Accept-Flags' заменить на 'A-F'

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)