Как проверить настоящие имена и фамилии - PHP - PullRequest
0 голосов
/ 17 февраля 2009

вот моя проблема: Я хочу проверить, вставляет ли пользователь настоящее имя и фамилию, проверяя, есть ли у него только буквы (любого алфавита) и 'или - в PHP. Я нашел решение здесь (но я не помню ссылку) о том, как проверить, есть ли в строке только буквы:

preg_match('/^[\p{L} ]+$/u',$name)

но я бы хотел признать, и - тоже. (Кодировка UTF8) Кто-нибудь может мне помочь, пожалуйста?

Ответы [ 7 ]

6 голосов
/ 17 февраля 2009

Немного не по теме, но какой смысл проверять имена?

Это не для предотвращения мошенничества; если люди пытаются дать вам поддельное имя, они могут легко напечатать строку случайных букв.

Это не для предотвращения ошибок; ввод знака препинания - это только одна из многих ошибок, которые вы можете совершить, и вряд ли при этом.

Это не для предотвращения внедрения кода; Вы должны предотвратить это, правильно закодировав свои выходные данные, независимо от того, какие символы они содержат.

Так почему же мы все это делаем?

5 голосов
/ 17 февраля 2009

(Международные) имена могут содержать много символов: пробелы, 's, тире, нормальные буквы, умлауты, акценты, ...

РЕДАКТИРОВАТЬ : Дело в том, как убедиться, что достаточно букв (всех языков), тире, 'и пробела? Нет ли имен, которые содержат точку (А как насчет «Доктор Нет»?), Двоеточие или еще какой-нибудь символ?

EDIT2 : Благодаря пользователю 'some', вероятно, из Швеции (оставившему комментарий) мы теперь знаем, что есть шведское имя "Andreas J: son Friberg". Помните двоеточие!

5 голосов
/ 17 февраля 2009

Похоже, вам просто нужно изменить регулярное выражение: [\ p {L} '-] +

2 голосов
/ 17 февраля 2009

В зависимости от набора символов, который вы хотите разрешить, вам просто нужно убедиться, что символы, которые вы хотите поддерживать, находятся внутри части '[]' регулярного выражения. Поскольку символ «-» имеет особое значение в этом контексте (он создает диапазон), он должен быть последним элементом в списке.

\ p {L} означает совпадение любого символа со свойством быть буквой. \ w имеет аналогичное значение, но также содержит символ '_', который вам, вероятно, не нужен.

preg_match('/^[A-Za-z \'-]+$/i',$name);

Будет соответствовать большинству распространенных имен, хотя если вы хотите поддерживать наборы чужих символов, вам понадобится более экзотическое регулярное выражение.

0 голосов
/ 27 февраля 2009

Обратите внимание, что приведенный вами пример не проверяет наличие у пользователя и фамилии, и имени, хотя я бы сказал, что так и должно быть. Вы не должны предполагать, что у человека есть больше чем одно имя. В настоящее время я работаю над приложением PHP, которое имеет дело с именами людей в контексте, и если я что-то обнаружил, это то, что вы не можете делать такие предположения :) Даже у многих не знаменитостей есть только одно имя.

Использование категорий Юникод, как в \ p {L}, было хорошей идеей, поскольку да, очевидно, что в именах людей будут присутствовать всевозможные символы из других языков. Тем не менее, как и \ p {L}, вам также необходимо учитывать комбинирование меток - то есть акцентов, умлаутов и т. Д., Которые люди добавляют в качестве дополнительных символов.

Так что, может быть, сразу после \ p {L} я бы добавил \ p {Mc}

Я бы в итоге получил

preg_match('/^[\pL\p{Mc} \'-]+$/u', $name)
0 голосов
/ 17 февраля 2009

если кодировка UTF-8, то у вас есть проблема - как вы можете проверять символы Центральной и Восточной Европы на латинице (диакритические знаки) или имена на кириллице, китайском или японском именах? это было бы чертовски регулярным выражением.

0 голосов
/ 17 февраля 2009

Это также должно сделать

/[\w'-]+/gi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...