Подтвердите имя пользователя как буквенно-цифровое с символами подчеркивания
На моей странице регистрации мне нужно проверить имена пользователей только как буквенно-цифровые, но также и с дополнительными символами подчеркивания. Я придумал это:
function validate_alphanumeric_underscore($str)
{
return preg_match('/^\w+$/',$str);
}
Кажется, что все работает нормально, но я не специалист по регулярному выражению! Кто-нибудь видит какие-либо проблемы?
Ответы
Ответ 1
Фактические совпадающие символы \w
зависят от используемой локали:
Символом "слово" является любая буква или цифра или символ подчеркивания, то есть любой символ, который может быть частью Perl " word". Определение букв и цифр контролируется таблицами символов PCRE и может варьироваться, если происходит сопоставление по языку. Например, в "fr" (французском) языке, для символов с акцентом используются некоторые коды символов, превышающие 128, и они соответствуют \w.
Итак, вам лучше указать, какие символы вы хотите разрешить:
/^[A-Za-z0-9_]+$/
Это позволяет использовать только буквенно-цифровые символы и подчеркивание.
И если вы хотите разрешить подчеркивание только как символ конкатенации и хотите заставить его начинать с символа алфавита:
/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/
Ответ 2
Здесь пользовательская функция для проверки строки с помощью PHP ctype_alnum в сочетании с массивом разрешенных символов:
<?php
$str = "";
function validate_username($str) {
// each array entry is an special char allowed
// besides the ones from ctype_alnum
$allowed = array(".", "-", "_");
if ( ctype_alnum( str_replace($allowed, '', $str ) ) ) {
return $str;
} else {
$str = "Invalid Username";
return $str;
}
}
?>
Ответ 3
попробовать
function validate_alphanumeric_underscore($str)
{
return preg_match('/^[a-zA-Z0-9_]+$/',$str);
}
Ответ 4
Выглядит хорошо. Обратите внимание, что вы не требуете размещения подчеркивания, так что "username_" и "___username" будут проходить.
Ответ 5
Я бы взял вторичное регулярное выражение gumbo, чтобы разрешить только подчеркивание как конкатенацию, но добавьте + после _, так что пользователь может быть как "special__username", просто небольшая настройка.
/^[A-Za-z][A-Za-z0-9]*(?:_+[A-Za-z0-9]+)*$/
Ответ 6
Ваше собственное решение прекрасно.
preg_match
использует Perl-подобные регулярные выражения, в которых класс символов \w
определен точно так, как вам нужно:
\w
- сопоставить символ "слова" (буквенно-цифровой плюс "_" )
(источник)