Перевірка імені та прізвища користувача регулярним виразом в 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');
Сподіваюсь стане Вам в нагоді і Ви не витратите стільки часу, скільки довелось витратити нам. Дякую за увагу!
Коментарі:
теоретично, якщо всі дані з бази у форматі utf-8, то достатньо використовувати юнікодні функції регулярних виразів (mb_ereg, mb_ereg_replace якось так) або ж чекати 6ого пхп, воно юнікодне буде :)
Поки воно з'явиться в світ. Поки хостери встановлять його на сервер. Поки хоча б трохи його протестують в реальних умовах.
Стосовно mb_* є дві причини, чому я їх уникаю. По-перше, це розширення не завжди присутнє. По-друге, не подобаються мені регулярні вирази POSIX. По-третє, з використанням цих функцій є свої підводні камені. Да хоча б відсутність повної підтримки української, що як я підозрюю не зменшить необхідності в передбачити в регулярному виразі наявність апострофа, а можливо й "ї" чи чогось іншого.
Пригодиться, дякую. Справ слово "реШулярним" в заголовку :) Мабуть, ти мав на увазі "регулярними".
Я, ось, з регулярними виразами не дуже дружу. Не підкажеш, як задати шаблон, який би в полі url з бази SQL-запитом (використовуючи REGEXP) відбирав лише сайти з зони .UA (домен 1-го рівня), тобто mysite.ua, але не враховував mysite.com.ua, mysite.in.ua (домени 2 і вище рівнів)?
Якщо я правильно зрозумів, то це має виглядати якось так:
/^[wd.]+@[wd]+.(ua)$/
Не допомогло. Або я шось не так роблю ;) Повертає пустий результат, хоча сайти, які задовільняють критерій присутні в таблиці. Я роблю, ось, такий запит:
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
Дякую за старання, треба мені "Регулярні вирази" трохи перечитати.
Відверто кажучи, я регулярками при роботі з БД не користувався, тому не можу сказати, на скільки вони відрізняються від PERL-сумісних. Треба буде й самому якось почитати :) Може тоді більш повну та точну відповідь зможу дати



