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


Автор: korob2001 2.8.2005, 21:28
Привет!!!
Столкнулся с такой проблемой, программа получает данные из формы, затем данные очищаются, под такой шаблон qr/^[A-Za-z0-9\s-]+$/. Всё вроде нормально, но мне если пользователь вводит символ, например из французского алфавита é или ê или символ нидерландского языка ë, то очистка работает не верно.
Вобщем если вводить такой символ напрямую в шаблон, то файл не сохраняется как текстовый и сообщает о том, что нужно сохранить его в формате Unicode. Если кто-нить знает как решить такую проблему, буду очень благодаре.
Спасибо.

Автор: chaos 3.8.2005, 06:29
не уверен, но все же, англ алфавит имеет коды
65(A)-90(Z)
97(a)-122(z)
48(0)-57(9)
45(-)
32(\s)

может тебе такое подойдет?
$str =~ s/[\x21-\x2C\x2E-\x2F\x3A-\x40\x5B-\x60\x7B-\xFF]//g;
или как-нибудь так
$str =~ s/[^a-zA-Z0-9\s-]//g;

Автор: wladk 3.8.2005, 17:59
Цитата(korob2001 @ 2.8.2005, 21:28)
Привет!!!
Столкнулся с такой проблемой, программа получает данные из формы, затем данные очищаются, под такой шаблон qr/^[A-Za-z0-9\s-]+$/. Всё вроде нормально, но мне если пользователь вводит символ, например из французского алфавита é или ê или символ нидерландского языка ë, то очистка работает не верно.


Почему не верно?

Цитата(korob2001 @ 2.8.2005, 21:28)

Вобщем если вводить такой символ напрямую в шаблон, то файл не сохраняется как текстовый и сообщает о том, что нужно сохранить его в формате Unicode. Если кто-нить знает как решить такую проблему, буду очень благодаре.
Спасибо.


А что если сначала прогнать всю строку через escapeHTML а уже потом производить очистку? Добавив необходимые символы в шаблон.

Автор: korob2001 4.8.2005, 02:59
Вобщем, что бы не эксперементировать на разных примерах, написал такой тестовый код:
Код

#!/usr/bin/perl -T
use strict;
use CGI;

my $cgi = new CGI;

# Выводим форму
sub show_form {
    my $mess = shift;
    $mess = ref( $mess ) ? $cgi->b( { -style => "color: #aa0000" }, join( $cgi->br(), @$mess ) )
                         : $mess
                         ? $mess
                         : "Укажите любое слово";
    print $cgi->start_html();
    print $cgi->start_form();
    print $cgi->h2( $mess );
    print $cgi->br();
    print $cgi->textfield( -name => 'title' );
    print $cgi->submit();
    print $cgi->end_form();
    print $cgi->end_html();
}

# Подпрограмма проверяет загрязнена ли переменная
sub is_tnt {
    my $var = shift;
    return !eval { $var++, kill 0; 1; };
}

# Подпрограмма очистки переменной
sub var_clean {
    my( $var, $pat ) = @_;
    if ( $var =~ /($pat)/ ) {
         $var = $1;
         return $var;
    } else {
         return $var;
    }
}

# Проверяем полученный параметр
sub parse_form {
    my @ERRORS = ();
    my $title = var_clean( $cgi->param('title'), qr/^[A-Za-z0-9\s-]+$/ );
    if ( is_tnt( $title ) ) {
         push( @ERRORS, "Не удалось очистить переменную \$title, значение не является допустимым" );
    }

    @ERRORS ? show_form(\@ERRORS) : show_form("Спасибо, ваши данные успешно добавлены в базу данных");
}

# Выводим заголовок
print $cgi->header( -charset => 'Windows-1251' );

# Условия программы
if ( defined $cgi->param('title') ) {
     parse_form();
} else {
     show_form();
}

Вот мне собственно нужно передать подпрограмме очистки переменной шаблон, который будет чистить слова латинского алфавита + диактрические символы. Вот например Бельгия на нидерландском языке пишется так België, вот мне её и нужно пропустить, а так же символы французского и немецкого языков, но о них позже, для начала хотя бы символ ë пропустить.
Вот например если я в выше приведённой форме введу слово België, то после перезагрузки старницы у меня в текстовом поле вообще последний символ заменяется на л, т.е. в текстовом поле теперь уже не België, а Belgiл.

PS: Спасибо за советы, сейчас буду пробовать ещё.

Автор: chaos 4.8.2005, 06:40
может быть что-то от сюда поможет
http://www.ahinea.com/en/tech/perl-unicode-struggle.html

Автор: Bolt 4.8.2005, 10:34
korob2001
use bytes?
or
use Encode qw(encode_utf8)
if perl -v > 5.6

Автор: sharq 16.8.2005, 12:47
korob2001 просто необходимо расширить шаблон qr/^[A-Za-zёéê0-9\s-]+$/.

smile

Автор: chaos 16.8.2005, 13:49
Цитата(sharq @ 16.8.2005, 12:47)
korob2001 просто необходимо расширить шаблон qr/^[A-Za-zёéê0-9\s-]+$/.

smile

ёéê не сохранить в текстовом файле!!!

Автор: sharq 16.8.2005, 18:02
chaos
Цитата(chaos @ 16.8.2005, 13:49)
éê не сохранить в текстовом файле!!!

с этим я согласен, поспешил.
С буквой ё - не согласен.

Автор: korob2001 16.8.2005, 22:14
Дело в том, что в Нидерландской винде все эти символы успешно сохраняются, в текстовые файлы, зато теряется возможность сохранять кирилицу, точнее она есть, но только как Unicode. Наверное прийдётся отказаться от русской винды или вообще от винды. smile((

Автор: sharq 17.8.2005, 13:53
korob2001 вот вариант:
Код

use strict;
use utf8;

print "Content-type: text/html; charset=utf-8\n\n";

my $chr = "\x{00EB}";  # \x{00E8}\x{00E9}\x{00EA}\x{00EB}

my $str = "Belgi".$chr;

print $str, "\n";

print ' ', ( $str =~ /^[\x{00E8}-\x{00EB}A-Za-z0-9\s\-]+$/ ? 'YES' : 'NO' );


smile

Автор: korob2001 17.8.2005, 20:29
sharq - да, но здесь проблема в том, что в данном варианте мы в программном коде устанавливаем этот символ. Пользователь же вводит это значение в форму, вот попробуй вставить его в код, который я привёл выше, а затем введи в форму этот символ.

Автор: sharq 17.8.2005, 20:49
korob2001
Цитата(korob2001 @ 17.8.2005, 20:29)
Пользователь же вводит это значение в форму

какая разница, если это значение (код) этого символа в Юникоде?

Если пользователь введет букву ё (ту, что в кириллице есть), то это буква будет иметь другой код в юникоде - \x0451.

Я, конечно, попробую, только вот раскладку поменяю...

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