Подтвердите имя пользователя как буквенно-цифровое с символами подчеркивания

На моей странице регистрации мне нужно проверить имена пользователей только как буквенно-цифровые, но также и с дополнительными символами подчеркивания. Я придумал это:

function validate_alphanumeric_underscore($str) { return preg_match('/^\w+$/',$str); } 

Кажется, что все работает нормально, но я не эксперт по регулярному выражению! Есть ли какие-либо проблемы?

Фактические совпадающие символы \w зависят от используемого языка :

Символом «слово» является любая буква или цифра или символ подчеркивания, то есть любой символ, который может быть частью слова «Perl». Определение букв и цифр контролируется таблицами символов PCRE и может варьироваться в зависимости от соответствия языкового соответствия. Например, в «fr» (французском) языке, для символов с акцентом используются некоторые коды символов, превышающие 128, и они сопоставляются символом \ w.

Поэтому вам лучше указать, какие символы вы хотите разрешить:

 /^[A-Za-z0-9_]+$/ 

Это позволяет использовать только буквенно-цифровые символы и подчеркивание.

И если вы хотите разрешить подчеркивание только как символ конкатенации и хотите, чтобы имя пользователя начиналось с символа алфавита:

 /^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/ 

Вот настраиваемая функция для проверки строки с помощью 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; } } ?> 

пытаться

 function validate_alphanumeric_underscore($str) { return preg_match('/^[a-zA-Z0-9_]+$/',$str); } 

Выглядит хорошо для меня. Обратите внимание, что вы не требуете размещения подчеркивания, так что «имя пользователя» и «___ имя пользователя» будут проходить.

Я бы взял вторичное регулярное выражение gumbo, чтобы разрешить только подчеркивание как конкатенацию, но добавьте + после _, так что пользователь может быть как «special__username», а только незначительная настройка.

/^[A-Za-z][A-Za-z0-9]*(?:_+[A-Za-z0-9]+)*$/

Ваше собственное решение отлично.

preg_match использует Perl-подобные регулярные выражения, в которых класс символов \w определен так, чтобы он точно соответствовал вам:

\w – Соответствует символу "word" (буквенно-цифровой плюс "_")

( источник )