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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск диактрических символов 
:(
    Опции темы
korob2001
Дата 2.8.2005, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



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


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
chaos
Дата 3.8.2005, 06:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

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



не уверен, но все же, англ алфавит имеет коды
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;

Это сообщение отредактировал(а) chaos - 3.8.2005, 07:48
PM WWW   Вверх
wladk
Дата 3.8.2005, 17:59 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



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

#!/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: Спасибо за советы, сейчас буду пробовать ещё.

Это сообщение отредактировал(а) korob2001 - 4.8.2005, 03:00


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
chaos
Дата 4.8.2005, 06:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

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



может быть что-то от сюда поможет
http://www.ahinea.com/en/tech/perl-unicode-struggle.html
PM WWW   Вверх
Bolt
Дата 4.8.2005, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



korob2001
use bytes?
or
use Encode qw(encode_utf8)
if perl -v > 5.6
PM WWW ICQ   Вверх
sharq
Дата 16.8.2005, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

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



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

smile



--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
chaos
Дата 16.8.2005, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

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



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

smile

ёéê не сохранить в текстовом файле!!!
PM WWW   Вверх
sharq
Дата 16.8.2005, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

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



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

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


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
korob2001
Дата 16.8.2005, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



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

Это сообщение отредактировал(а) korob2001 - 16.8.2005, 22:15


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
sharq
Дата 17.8.2005, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

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



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


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
korob2001
Дата 17.8.2005, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



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


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
sharq
Дата 17.8.2005, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

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



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

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

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

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


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




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


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

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