Я бы действительно сказал: не пытайтесь проверять имена: в тот или иной день ваш код встретится с именем, которое он считает «неправильным» ... И как вы думаете, как бы вы отреагировали, когда приложение скажет ему? " ваше имя недействительно "?
В зависимости от того, чего вы действительно хотите достичь, вы можете рассмотреть возможность использования какого-либо черного списка / фильтров, чтобы исключить «неназванные» имена, о которых вы думали: возможно, они позволят некоторым «плохим именам» пройти, но при по крайней мере, это не должно препятствовать доступу существующего имени к вашему приложению.
Вот несколько примеров правил, которые приходят на ум:
- без номера
- без специальных символов, как
"~{()}@^$%?;:/*§£ø
и, возможно, некоторые другие
- не более 3 пробелов?
- ни один из "admin", "support", "moderator", "test" и некоторые другие очевидные не-имена, которые люди склонны использовать, когда они не хотят вводить свое настоящее имя ...
- (но, если они не хотят давать вам свое имя, их все равно не будет, даже если вы запретите им вводить несколько случайных букв, они могут просто использовать настоящее имя ... Которое не принадлежит им)
Да, это не идеально; и да, он пропустит некоторые неназванные имена ... Но для вашего приложения это, вероятно, намного лучше, чем сказать кому-то "ваше имя неверно" (да, я настаиваю ^^)
И, чтобы ответить на комментарий вы оставили под другим ответом:
Я мог бы просто запретить самой команде
символы для SQL-инъекции и XSS
атаки,
О SQL Injection, вы должны экранировать свои данные перед отправкой в базу данных; и, если вы всегда избегаете этих данных (вы должны!), вам не нужно заботиться о том, что пользователи могут вводить или нет: поскольку они экранированы, вы всегда рискуете.
То же самое в XSS: поскольку вы всегда избегаете своих данных при выводе их (вы должны!), Нет риска инъекции; -)
РЕДАКТИРОВАТЬ: если вы просто используете это регулярное выражение, это не будет работать очень хорошо:
следующий код:
$rexSafety = "/^[^<,\"@/{}()*$%?=>:|;#]*$/i";
if (preg_match($rexSafety, 'martin')) {
var_dump('bad name');
} else {
var_dump('ok');
}
Получит вам хотя бы предупреждение:
Warning: preg_match() [function.preg-match]: Unknown modifier '{'
Вы должны убежать хотя бы от некоторых из этих специальных символов; Я позволю вам покопаться в шаблонах PCRE для получения дополнительной информации (действительно есть много информации о PCRE / regex; и я не смогу объяснить все это)
Если вы действительно хотите проверить, что ни один из этих символов не находится внутри заданного фрагмента данных, вы можете получить что-то вроде этого:
$rexSafety = "/[\^<,\"@\/\{\}\(\)\*\$%\?=>:\|;#]+/i";
if (preg_match($rexSafety, 'martin')) {
var_dump('bad name');
} else {
var_dump('ok');
}
(Это быстрое и грязное предложение, которое нужно усовершенствовать!)
Этот говорит "ОК" (ну, я определенно надеюсь, что с моим собственным именем все в порядке!)
И тот же пример с некоторыми специальными символами, например:
$rexSafety = "/[\^<,\"@\/\{\}\(\)\*\$%\?=>:\|;#]+/i";
if (preg_match($rexSafety, 'ma{rtin')) {
var_dump('bad name');
} else {
var_dump('ok');
}
скажет "плохое имя"
Но обратите внимание, я не полностью проверил это, и, вероятно, требуется больше работы! Не используйте это на своем сайте, если вы не проверили это очень тщательно!
Также обратите внимание, что одиночная кавычка может быть полезна при попытке сделать SQL-инъекцию ... Но это, вероятно, символ, допустимый в некоторых именах ... Так что простого исключения некоторых символов может быть недостаточно; -)