|
|
|
| Доброе утро.
Возникла проблема с кирилическими символами при авторизации.
Делаю проверку введённых символов
<?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....
Подскажите, пожалуйста, как решить проблему? | |
|
|
|
|
|
|
|
для: Slo_Nik
(24.05.2010 в 10:08)
| | Локаль устанавливаете при помощи функции setlocale()? | |
|
|
|
|
|
|
|
для: cheops
(24.05.2010 в 10:24)
| | локаль ни как не устанавливаю, сейчас попробую. | |
|
|
|
|
|
|
|
для: Slo_Nik
(24.05.2010 в 10:36)
| | Заодно глянь установлена-ли на сервере нужная тебе локаль... | |
|
|
|
|
|
|
|
для: Slo_Nik
(24.05.2010 в 10:08)
| | | |
|
|
|
|
|
|
|
для: Саня
(24.05.2010 в 10:24)
| | подстановка модификатора проблему не решает | |
|
|
|
|
|
|
|
для: Slo_Nik
(24.05.2010 в 10:08)
| | Может проще так и не морочить себе голову:
только локаль выстави.
<?php
...
if((!ctype_alpha($_POST['login'])) or (!ctype_alpha($_POST['password'])))
...
?>
|
| |
|
|
|
|
|
|
|
для: Slo_Nik
(24.05.2010 в 10:08)
| | Поглядите внимательней на маски.
Для латинского варианта Вы явно указываете оба поддиапазона как для строчных, так и для заглавных букв. Для русского - почему-то лишь один - для строчных.
А ведь казалось бы чего проще явно указать и тот и другой. Модификатор u, само собой, поставить (иначе это никакое не utf8).
И всё. Зависимость от локали, считай, устранена. | |
|
|
|
|
|
|
|
для: Trianon
(24.05.2010 в 11:10)
| | Во-во, непонятно вобще зачем ставить 2 варианта (верхний и нижний регистр), если используется модификатор i | |
|
|
|
|
|
|
|
для: 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"? | |
|
|
|
|
|
|
|
для: 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. | |
|
|
|
|
|
|
|
для: Trianon
(24.05.2010 в 13:20)
| | благодарствую, буду читать.... :) | |
|
|
|
|
|
|
|
для: Trianon
(24.05.2010 в 13:20)
| | Опять приходится возвратиться к теме.
С логином разобрался, работает при любом регистре, если в базе в нижнем регистре символы, а ввод в форму в верхнем, то регистр не учитывается.
А вот с паролем дело по другому, регистр учитывается. в общем то правильно, предполагается, что пароль будет в друх регистрах, тогда получается, что модификатор "i" не работает в этом случае, даже если он присутствует.
или что то я опять не так понял? | |
|
|
|
|
|
|
|
для: Slo_Nik
(24.05.2010 в 16:49)
| | учитывается/не учитывается кем?
данные перед сравнением следует нормализовывать. | |
|
|
|