Перевірка імені та прізвища користувача регулярним виразом в php

Опубліковано: 2008-12-19   16:58:32

PHPЗдавалося б елементарне завадання: "Перевірити ім'я, прізвище користувача на коректність". Ну зазвичай так і є. Однак, завадння ускладнюється при потребі перевіряти ім'я користувача надекількох мовах. Наприклад, англійська, російська та українська, що є актуальним для нашої країни.

Зрозуміло, що добрим варіантом є використання регулярних виразів. Ну особисто я полюбляю PERL-сумісні регулярні вирази, так як вони є більш потужними, та працюють швидше (в усякому разі так було раніше). Здавалося б для всіх символів оптимальним є використання символьного класу w, причому весь рядок має складатись з таких символі:

preg_match("/^[\w]+$/", $str);

Однак в рамках такого підходу виникають такі проблеми:

  • наявність в українській мові апострофу;
  • символьний клас \w не включає в себе кирилічні символи

Для початку вірішемо першу проблему:

preg_match("/^[а-яА-Я\w]+$/", $str)

Однак виявилось, що ряд символів (наприклад, "ч", "ц" та ще з десяток інших) не потрапили в діапазон а-я. Довелось додати:

preg_match("/^[а-яА-Яр-х\w]+$/", $str)

Як не дивно, однак так це запрацювало. І на сам кінець додамо підтримку апострофа. Шляхом емпіричних дослідів виявили, що необхідно це робити ось так:

preg_match("/^((\')|[а-яА-Яр-х\w])+$/", $str)

Ось такий неявний вираз вийшов. Доречі, це працює в мене при встановленій локалі:

setlocale(LC_ALL, 'ru_RU.UTF-8');

Сподіваюсь стане Вам в нагоді і Ви не витратите стільки часу, скільки довелось витратити нам. Дякую за увагу!

Коментарі: 8
 

Коментарі:

vbhjckfd2008-12-20 13:18:03 :

теоретично, якщо всі дані з бази у форматі utf-8, то достатньо використовувати юнікодні функції регулярних виразів (mb_ereg, mb_ereg_replace якось так) або ж чекати 6ого пхп, воно юнікодне буде :)

 
GrAndSE2008-12-21 11:30:35 :

Поки воно з'явиться в світ. Поки хостери встановлять його на сервер. Поки хоча б трохи його протестують в реальних умовах.

Стосовно mb_* є дві причини, чому я їх уникаю. По-перше, це розширення не завжди присутнє. По-друге, не подобаються мені регулярні вирази POSIX. По-третє, з використанням цих функцій є свої підводні камені. Да хоча б відсутність повної підтримки української, що як я підозрюю не зменшить необхідності в передбачити в регулярному виразі наявність апострофа, а можливо й "ї" чи чогось іншого.

 
virua2008-12-22 10:06:48 :

Пригодиться, дякую. Справ слово "реШулярним" в заголовку :) Мабуть, ти мав на увазі "регулярними".

 
GrAndSE2008-12-22 11:31:08 :

Дякую. Не розумію, як же я не помітив..

 
virua2009-01-20 11:44:06 :

Я, ось, з регулярними виразами не дуже дружу. Не підкажеш, як задати шаблон, який би в полі url з бази SQL-запитом (використовуючи REGEXP) відбирав лише сайти з зони .UA (домен 1-го рівня), тобто mysite.ua, але не враховував mysite.com.ua, mysite.in.ua (домени 2 і вище рівнів)?

 
GrAndSE2009-01-21 23:43:29 :

Якщо я правильно зрозумів, то це має виглядати якось так:

/^[wd.]+@[wd]+.(ua)$/

 
virua2009-01-22 00:00:10 :

Не допомогло. Або я шось не так роблю ;) Повертає пустий результат, хоча сайти, які задовільняють критерій присутні в таблиці. Я роблю, ось, такий запит:

SELECT *

FROM `site_list`

WHERE `url`

REGEXP CONVERT( _utf8 'тут_регулярний_вираз'

USING cp1251 )

COLLATE cp1251_general_ci

де site_list - таблиця, url - поле, адреса сайту.

Зараз в мене працює по простому:

SELECT *

FROM `site_list`

WHERE `url`

REGEXP CONVERT( _utf8 '.(ua)$'

USING cp1251 )

COLLATE cp1251_general_ci

Дякую за старання, треба мені "Регулярні вирази" трохи перечитати.

 
GrAndSE2009-01-25 13:09:27 :

Відверто кажучи, я регулярками при роботі з БД не користувався, тому не можу сказати, на скільки вони відрізняються від PERL-сумісних. Треба буде й самому якось почитати :) Може тоді більш повну та точну відповідь зможу дати

 

Додати коментар

user

email

url

text

Повідомляти про новікоментарі