На моей странице регистрации мне нужно проверить имена пользователей только как буквенно-цифровые, но также и с дополнительными символами подчеркивания. Я придумал это:
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" (буквенно-цифровой плюс "_")
( источник )