Я всегда боролся с RegEx, поэтому простите меня, если это может показаться ужасным подходом к решению моей проблемы.
Когда пользователи вводят имя и фамилию, я начал использовать только базовые, проверьте верхний и нижний регистр, пробел, апострофы и дефисы
if (!preg_match("/^[a-zA-Z\s'-]+$/", $name)) { // Error }
Теперь я понимаю, что это не самое лучшее, поскольку у людей могут быть такие вещи, как: д-р Мартин Лютер Кинг-младший (с запятой и полным ходом). Поэтому я предполагаю, что, изменив его на это, он будет несколько более эффективным.
if (!preg_match("/^[a-zA-Z\s,.'-]+$/", $name)) { // Error }
Затем я увидел имя девушки, которое я знаю на своем Facebook, который написал ее имя как Siân, что заставило меня задуматься о именах, которые содержат умлаутов, а также о японских и китайских / корейских / русских персонажах. Поэтому я начал искать и находить способы, записывая каждый из этих персонажей в таком виде.
if (!preg_match("/^[a-zA-Z\sàáâäãåèéêëìíîïòóôöõøùúûüÿýñçčšžÀÁÂÄÃÅÈÉÊËÌÍÎÏÒÓÔÖÕØÙÚÛÜŸÝÑßÇŒÆČŠŽ∂ð ,.'-]+$/u", $first_name)) { // Error }
Как вы можете себе представить, это очень длинный ветер, и я вполне уверен, что существует гораздо более простой RegEx, который может достичь этого. Как я уже сказал, я искал, но это лучшее, что я могу сделать.
Итак, что такое хороший способ проверить символы верхнего и нижнего регистра, запятые, полные остановки, апострофы, гипсы, умлауты, латынь, японский / русский и т. Д.
Вы можете использовать класс символов Unicode. \pL
охватывает почти все символы букв.
http://php.net/manual/en/regexp.reference.unicode.php
if (!preg_match("/^[a-zA-Z\s,.'-\pL]+$/u", $name))
См. Также http://www.regular-expressions.info/unicode.html , но будьте осторожны, что PHP / PCRE понимает только сокращенные имена классов.
\pL
уже включает az
и AZ
, поэтому упомянутый шаблон "/^[a-zA-Z\s,.'-\pL]+$/u"
можно упростить до
"/^[\s,.'-\pL]+$/"
также не требуется модификатор u
.
Вероятно, возможно, будет некоторое ослабление квалификаций, разрешив другие типы пунктуации.
Одна вещь, которая должна быть ограничением, требует хотя бы одной буквы.
Изменение регулярного выражения марио:
if (!preg_match("/^(?:[\s,.'-]*[a-zA-Z\pL][\s,.'-]*)+$/u", $name))