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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с рег выражением, Англ яз строки выделяет, а русские - нет 
:(
    Опции темы
Konsul
Дата 28.1.2008, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго времени суток!
Вообщем есть строка $message, содержащая в себе некое сообщение. Нужно проверить, нет ли в нём матов и пр. нехороших слов. Все эти слова хранятся в словаре, т.е. в массиве @deny. Ищем их вот каким образом:
Код

@deny=('fuck','дурак','shit');
$i=0;
until(@deny[$i] eq ''){
 foreach($message){
  chomp(@deny[$i]);
  if(/@deny[$i]/){
   print "Вы написали мат, идите нафиг.\n";
   exit;
   }
  }
 $i++;
 }

И получается, что на англоязычных словах (типа fuck и shit) она работает, определяет их исправно, а на русскоязычных (типа дурак) - пропускает их... Кто подскажет, в чём проблема?
Заранее благодарен!
PM MAIL   Вверх
ginnie
Дата 28.1.2008, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Уважаемый Konsul,  скорее всего не совпадают кодировки слова "дурак" в исходнике и в переменной $message.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
nitr
Дата 29.1.2008, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



Как вариант - то что указал ginnie.
А логика верна?

Чтобы сообщение не резать, то лучше пройтись по "словарю мат. слов", чем всё время преобразовывать сообщение в слова и сверять. Хотя у вас в скрипте очень много "ошибок".
Вот как вариант.
Код
#!perl
use strict;
use warnings;

my $message = 'Кто тут дурак?';
my @deny = qw(you deny дурак);
foreach (@deny) {
    if ($message =~ /$_/) {
        print "Kick you!\n";
    }
}




P.S.: я не применял мат.слова, "дурак" пока ещё литературное smile Всё же правила форума ;)

Это сообщение отредактировал(а) nitr - 29.1.2008, 02:04


--------------------
PM   Вверх
Konsul
Дата 3.2.2008, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Проблема оказалась несколько другого плана. Дело не в языке, а в том, что список @deny считывается из файла:

Код

open(DATA, "$deny_list");
 @deny=<DATA>;
 close(DATA);


И далее по списку идёт проверка по своему методу, или по вашему, nitr. И  ничего не находит!(( А если задать прям в программе запретный список:
Код

@deny=('fuck','дурак','shit');

То всё находит. Как я понял, при считывании строк из файла в конце каждой строки добавляется символ перехода на след строку.  Поэтому я добавил в код оператор chomp:
Код

foreach (@deny) {
    chomp($_);
    if ($message =~ /$_/) {
        print "Kick you!\n";
    }
}


И всё равно не получается. Если после foreach написать чтобы она выписала все элементы массива (print $_), то они все слова выведутся в одну строку через пробел. Т.е. получается при считывании файла в массив в конце каждой строки добавляется непонятный символ.
Подскажите, как тут быть?
PM MAIL   Вверх
nitr
Дата 3.2.2008, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



Konsul, не знаю ваших причин, слишком мало инфы даёте...
deny_list.txt
Код
первый_мат
второй_мат
третий_мат


test.pl
Код
#!perl
use strict;
use warnings;

my $message = 'Кто тут первый_мат?';

open FILE, '<', 'deny_list.txt';
my @deny = <FILE>;
close FILE;

foreach (@deny) {
    chomp;
    if ($message =~ /$_/) {
         print "Kick you!\n";
     }
}

$message = 'Кто тут второй_мат?';
foreach (@deny) {
    chomp;
    if ($message =~ /$_/) {
         print "Kick you!\n";
     }
}



--------------------
PM   Вверх
ginnie
Дата 3.2.2008, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Уважаемый Konsul, возможно, я не прав, но как вариант: файл словаря в конце строк может иметь "\r\n" (windows), а скрипт запускается по unix'ом, где переменная $/="\n", поэтому после chomp() в каждом слове остается "\r". Судя по тому, что у Вас print() вывел слова с пробелами - это скорее всего не "\r".
Я бы вывел слова из массива
Код

foreach $word (@deny) {
    print "|$word|";
    map { print ord($_),' '; } split(//, $word);
    print "\n";
} 

тогда все станет ясно.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
nitr
Дата 4.2.2008, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



Если такая причина, то chomp(); можно заменить s/s+//g;
Код
foreach (@deny) {
    s/\s+//g;
    if ($message =~ /$_/) {
             print "Kick you!\n";
     }
}



--------------------
PM   Вверх
Konsul
Дата 4.2.2008, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



nitr, вот теперь всё ок работает! Попробовал ваш вариант, но такая же была фигня. А потом заменил chomp на s/s+//g и всё заработало! Спасибо!

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


 




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


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

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