Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Регулярные выражения > Чет не работает...


Автор: Vetlblya 8.2.2010, 10:52
Передаю в код строку "dfgdfg!#dfg$%jh^y&*yy()y" в условии работает ложь. В другой раз передаю строку "jhtgdjgh76756" и срабатывает опять ложь. Как произвести проверку наличия символов "][<>\|&;`'\"*\$\?~\^(){}\n\r" в строке, чтобы срабатывала истина, когда они присутствуют???????

my $query = $ENV{QUERY_STRING};

my $metasymbols = "][<>\|&;`'\"*\$\?~\^(){}\n\r";

print "Content-Type:text/html\n\n";

if ($query =~ s/[$metasymbols\\]//g) 
     {
     print "<h2>1</h2><br>";
     print $query;
    }
else
    {
     print "<h2>2</h2><br>";
     print $query;
    }

Автор: JAPH 8.2.2010, 11:49
Странное экранирование. Экранировать нужно для регулярки квадратные скобки и слэш; для строки в двойных кавычках $, чтобы не подставлять $?. Хотя вроде без экранирования ][ тоже работает - DWIM smile

Код

my $query = "dfgdfg!#dfg$%jh^y&*yy()y";
my $metasymbols = "\\]\\[<>\\\\|&;`'\"*\$?~^(){}\n\r";
#print "Content-Type:text/html\n\n";
if ($query =~ s/[$metasymbols]//g) {
     print "<h2>1</h2><br>";
     print $query;
} else {
     print "<h2>2</h2><br>";
     print $query;
}

Автор: Vetlblya 8.2.2010, 12:37
Цитата(JAPH @ 8.2.2010,  11:49)
Странное экранирование. Экранировать нужно для регулярки квадратные скобки и слэш; для строки в двойных кавычках $, чтобы не подставлять $?. Хотя вроде без экранирования ][ тоже работает - DWIM smile

Код

my $query = "dfgdfg!#dfg$%jh^y&*yy()y";
my $metasymbols = "\\]\\[<>\\\\|&;`'\"*\$?~^(){}\n\r";
#print "Content-Type:text/html\n\n";
if ($query =~ s/[$metasymbols]//g) {
     print "<h2>1</h2><br>";
     print $query;
} else {
     print "<h2>2</h2><br>";
     print $query;
}

попробовал с экранированием всерно на ложь вылетает обоих случаях. пробовал W, не помогает. 

Автор: JAPH 8.2.2010, 12:55
Как определяем, что вылетает? Кэш браузера ни при чем? Не может быть проблема в другом участке кода? Поставьте warn для отладочных выводов в лог.
P.S. Зачем цитировать пост целиком..

Автор: Vetlblya 8.2.2010, 13:07
Цитата(JAPH @ 8.2.2010,  12:55)
Как определяем, что вылетает? Кэш браузера ни при чем? Не может быть проблема в другом участке кода? Поставьте warn для отладочных выводов в лог.
P.S. Зачем цитировать пост целиком..

не так выразился... вылетает - в условии переходит всегда в ложь, при передаче любой строки, с символами "корявыми" или без них.  в другом не может. что такое warn  и куда его поставить?
p.s. увлекся

Автор: JAPH 8.2.2010, 13:14
Цитата(Vetlblya @ 8.2.2010,  12:37)
пробовал W, не помогает.

еще вот это не расшифровал)

warn - списковый оператор, выводящий предупреждение в STDERR, что в веб-программировании обычно направляется в лог ошибок.

Код
my $query = $ENV{'QUERY_STRING'};
warn "\$query: $query\n";
my $metasymbols = "\\]\\[<>\\\\|&;`'\"*\$?~^(){}\n\r";
print "Content-Type:text/html\n\n";
if ($query =~ s/[$metasymbols]//g) {
     warn "True";
     print "<h2>1</h2><br>";
     print $query;
} else {
     warn "False";
     print "<h2>2</h2><br>";
     print $query;
}

Автор: Vetlblya 8.2.2010, 13:24
Цитата(JAPH @ 8.2.2010,  13:14)
warn - списковый оператор, выводящий предупреждение в STDERR, что в веб-программировании обычно направляется в лог ошибок.

я дико извиняюсь за свою тупость и невежество!!! а где хранится этот лог???

Автор: JAPH 8.2.2010, 13:27
Это хороший вопрос =)
А где вы тестируете скрипт?
Попробуйте поискать файл error.log в: корневой папке сайта, в папке веб-сервера, просто поиском по файлам =)

Автор: Vetlblya 8.2.2010, 13:38
две последние строчки из этого файла:
[Mon Feb 08 13:23:48 2010] [error] [client 127.0.0.1] $query: q=jhtgdjgh76756, referer: http://127.0.0.1/menu.html
[Mon Feb 08 13:23:50 2010] [error] [client 127.0.0.1] $query: q=dfgdfg!, referer: http://127.0.0.1/menu.html

чего они значат?

Автор: JAPH 8.2.2010, 13:42
Сравнивая с 
Код
warn "\$query: $query\n";
 можно смотреть, чему равна $query. А вот почему не вывелось ни True, ни False.. Давайте к ним на всякий случай прицепим \n: 
Код
warn "True\n";
 и с False то же

Автор: Vetlblya 8.2.2010, 13:49
warn "True\n"; warn "False\n"; поставил сразу после условия.

вот что выдал error.log
[Mon Feb 08 13:45:34 2010] [error] [client 127.0.0.1] $query: q=jhtgdjgh76756, referer: http://127.0.0.1/menu.html
[Mon Feb 08 13:45:34 2010] [error] [client 127.0.0.1] True, referer: http://127.0.0.1/menu.html
[Mon Feb 08 13:45:34 2010] [error] [client 127.0.0.1] False, referer: http://127.0.0.1/menu.html

Автор: JAPH 8.2.2010, 13:50
Нет уж, надо именно в условии, чтобы различить, warn из которой ветки выдался =)

Кстати, подумалось вот о чем: не могут ли искомые символы быть url-encoded, предстать в форме %22, например?
Код
my $query = $ENV{'QUERY_STRING'};
warn "\$query: $query\n";
my $metasymbols = "\\]\\[<>\\\\|&;`'\"*\$?~^(){}\n\r";
print "Content-Type:text/html\n\n";
if ($query =~ s/[$metasymbols]//g) {
     warn "True\n";
     print "<h2>1</h2><br>";
     print $query;
} else {
     warn "False\n";
     print "<h2>2</h2><br>";
     print $query;
}

Автор: Vetlblya 8.2.2010, 13:50
поставил warn "True\n"; warn "False\n"; внутри веток условия. лог выглядит так:
[Mon Feb 08 13:48:44 2010] [error] [client 127.0.0.1] $query: q=dfgdfg!, referer: http://127.0.0.1/menu.html
[Mon Feb 08 13:48:44 2010] [error] [client 127.0.0.1] False, referer: http://127.0.0.1/menu.html
[Mon Feb 08 13:48:45 2010] [error] [client 127.0.0.1] $query: q=jhtgdjgh76756, referer: http://127.0.0.1/menu.html
[Mon Feb 08 13:48:45 2010] [error] [client 127.0.0.1] False, referer: http://127.0.0.1/menu.html

Добавлено через 1 минуту и 48 секунд
Цитата

не могут ли искомые символы быть url-encoded, предстать в форме %22, например?


если они url-encoded то что с ними делать? 

Автор: JAPH 8.2.2010, 14:06
А вы вводили строки, которые содержат искомые символы? Попробуйте.

Если url-encoded.. то декодировать =)
Код
s/%(..)/chr hex $1/eg;

Можно переложить эту заботу на CGI, который умеет самостоятельно выковыривать все пришедшие параметры, разбираться с url-encoded и т.п. вещами.

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