URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4606
[ Назад ]

Исходное сообщение
"Помогите с регексами"

Отправлено Dr. Nebula , 31-Авг-05 18:12 
Пытаюсь нормально настроить squidguard.cgi

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

строка:
clientaddr=192.168.16.1+clientname=+clientident=login+srcclass=sample-clients+targetclass=porn+url=http://www.sex.ru/

Код для парсинга
  if (defined($query)) {
    while ($query =~ /^\&?([^\&=]+)=\"([^\"]*)\"(.*)/ || $query =~ /^\&?([^\&=]+)=([^\&=]*)(.*)/) {
      my $key = $1;
      my $value = $2;
      $value = %word->{"unknown"}->{$lang} unless(defined($value) && $value && $value ne "unknown");
      $query = $3;
      if ($key =~ /^(clientaddr|clientident|clientuser|clientgroup|targetgroup|url)$/) {
        eval "\$$key = \$value";
      }
      if ($query =~ /^url=(.*)/) {
        $url = $1;
        last;
      }
    }
  }

Если убрать в выражении кавычки - получим что все кроме урла забьется в clientaddr. А иначе - вобще не парсит толком


Содержание

Сообщения в этом обсуждении
"Помогите с регексами"
Отправлено ihor , 31-Авг-05 20:51 
то, что сразу бросается в глаза:
скрипт ожидает в качестве разделителя '&' а в указанной строке используется '+'.
т.о. образом нужно заменить

$query =~ /^\&?([^\&=]+)=\"([^\"]*)\"(.*)/ || $query =~ /^\&?([^\&=]+)=([^\&=]*)(.*)/

на

$query =~ /^\+?([^\+=]+)=\"([^\"]*)\"(.*)/ || $query =~ /^\+?([^\+=]+)=([^\+=]*)(.*)/

но честно говоря, криво это как-то всё, может где-то ещё что вылезет :(


"Помогите с регексами"
Отправлено гость , 18-Июн-08 07:36 
>[оверквотинг удален]
>т.о. образом нужно заменить
>
>$query =~ /^\&?([^\&=]+)=\"([^\"]*)\"(.*)/ || $query =~ /^\&?([^\&=]+)=([^\&=]*)(.*)/
>
>на
>
>$query =~ /^\+?([^\+=]+)=\"([^\"]*)\"(.*)/ || $query =~ /^\+?([^\+=]+)=([^\+=]*)(.*)/
>
>но честно говоря, криво это как-то всё, может где-то ещё что вылезет
>:(

Поменять надо + на & и все будет ок