Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: авторизация, проблема с кирилицей
 
 автор: Slo_Nik   (24.05.2010 в 10:08)   письмо автору
 
 

Доброе утро.
Возникла проблема с кирилическими символами при авторизации.
Делаю проверку введённых символов

<?php 
if (!empty($_POST['login']) && !empty($_POST['password'])){
if(!
preg_match("|^[a-zа-яё]+$|i",$_POST['login']) or !preg_match("|^[0-9a-zA-Z]+$|i",$_POST['password'])){
echo 
"<p class='info' align='center'>Введите корректные данные в поля формы<br><a href='index.php'>Назад</a></p>";
exit();
}
?>

При таком разкладе постоянно выдаёт предупреждение, что "введите корректные ....." если логин кирилицей, если латинскими, то всё нормально.
Данные в базе в utf 8, файлы в utf 8....
Подскажите, пожалуйста, как решить проблему?

  Ответить  
 
 автор: cheops   (24.05.2010 в 10:24)   письмо автору
 
   для: Slo_Nik   (24.05.2010 в 10:08)
 

Локаль устанавливаете при помощи функции setlocale()?

  Ответить  
 
 автор: Slo_Nik   (24.05.2010 в 10:36)   письмо автору
 
   для: cheops   (24.05.2010 в 10:24)
 

локаль ни как не устанавливаю, сейчас попробую.

  Ответить  
 
 автор: Legenda   (24.05.2010 в 10:37)   письмо автору
 
   для: Slo_Nik   (24.05.2010 в 10:36)
 

Заодно глянь установлена-ли на сервере нужная тебе локаль...

  Ответить  
 
 автор: Саня   (24.05.2010 в 10:24)   письмо автору
 
   для: Slo_Nik   (24.05.2010 в 10:08)
 

|^[a-zа-яё]+$|iu

  Ответить  
 
 автор: Slo_Nik   (24.05.2010 в 10:35)   письмо автору
 
   для: Саня   (24.05.2010 в 10:24)
 

подстановка модификатора проблему не решает

  Ответить  
 
 автор: Legenda   (24.05.2010 в 10:25)   письмо автору
 
   для: Slo_Nik   (24.05.2010 в 10:08)
 

Может проще так и не морочить себе голову:
только локаль выстави.

<?php
...
if((!
ctype_alpha($_POST['login'])) or (!ctype_alpha($_POST['password']))) 
...
?>

  Ответить  
 
 автор: Trianon   (24.05.2010 в 11:10)   письмо автору
 
   для: Slo_Nik   (24.05.2010 в 10:08)
 

Поглядите внимательней на маски.
Для латинского варианта Вы явно указываете оба поддиапазона как для строчных, так и для заглавных букв. Для русского - почему-то лишь один - для строчных.
А ведь казалось бы чего проще явно указать и тот и другой. Модификатор u, само собой, поставить (иначе это никакое не utf8).
И всё. Зависимость от локали, считай, устранена.

  Ответить  
 
 автор: Legenda   (24.05.2010 в 11:15)   письмо автору
 
   для: Trianon   (24.05.2010 в 11:10)
 

Во-во, непонятно вобще зачем ставить 2 варианта (верхний и нижний регистр), если используется модификатор i

  Ответить  
 
 автор: Slo_Nik   (24.05.2010 в 13:00)   письмо автору
 
   для: Trianon   (24.05.2010 в 11:10)
 

Исправил

<?php 
if(!preg_match("|^[a-zA-ZА-ЯЁа-яё]+$|iu",$_POST['login']) or !preg_match("|^[0-9a-zA-Z]+$|iu",$_POST['password'])){
?>

добавил верхний регистр и модификатор "u", вроде нормально работает, спасибо.
но осталось непонятным влияние модификатора "u" на кодировку, в той литературе, что есть у меня ни чего не сказано, как этот модификатор влияет на кодировку.(книги "PHP 5/6 третье издание" и Фридл "Рег. выражения").
и не понятно использование модификатора "i". почему если не указывать в маске диапазон для заглавных букв, то проверка работает криво, стоит только указать, всё начинает работать. ведь, как я понял модификатор "i" убирает зависимось от регистра символов.

p.s. есть ли разница между модификаторами "u" и "U"?

  Ответить  
 
 автор: Trianon   (24.05.2010 в 13:20)   письмо автору
 
   для: Slo_Nik   (24.05.2010 в 13:00)
 

>Исправил
>добавил верхний регистр и модификатор "u", вроде нормально работает, спасибо.
>но осталось непонятным влияние модификатора "u" на кодировку, в той литературе, что есть у меня ни чего не сказано, как этот модификатор влияет на кодировку.(книги "PHP 5/6 третье издание" и Фридл "Рег. выражения").

Для этого следует представлять себе, что на самом деле такое utf-8 и чем оно отличается от однобайтовых кодировок.
Если вкратце - preg-функции без модификатора u с utf-8 работать не будут категорически.


>и не понятно использование модификатора "i".
Чтобы i работал, система должна знать, что к примеру ц и Ц - фактически одна и та же буква алфавита. Если i не применять, системе это знать необязательно.

Вопрос - где, когда и как Вы дали знать системе, что ц и Ц - одно и то же?

Вот поэтому и не работает с i

>p.s. есть ли разница между модификаторами "u" и "U"?
есть.

читайте мануал про функциям PCRE.

  Ответить  
 
 автор: Slo_Nik   (24.05.2010 в 13:24)   письмо автору
 
   для: Trianon   (24.05.2010 в 13:20)
 

благодарствую, буду читать.... :)

  Ответить  
 
 автор: Slo_Nik   (24.05.2010 в 16:49)   письмо автору
 
   для: Trianon   (24.05.2010 в 13:20)
 

Опять приходится возвратиться к теме.
С логином разобрался, работает при любом регистре, если в базе в нижнем регистре символы, а ввод в форму в верхнем, то регистр не учитывается.
А вот с паролем дело по другому, регистр учитывается. в общем то правильно, предполагается, что пароль будет в друх регистрах, тогда получается, что модификатор "i" не работает в этом случае, даже если он присутствует.
или что то я опять не так понял?

  Ответить  
 
 автор: Trianon   (24.05.2010 в 20:52)   письмо автору
 
   для: Slo_Nik   (24.05.2010 в 16:49)
 

учитывается/не учитывается кем?
данные перед сравнением следует нормализовывать.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования