Подтвердите имя пользователя как буквенно-цифровой с подчеркиванием - PullRequest
35 голосов
/ 26 августа 2009

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

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

Что, кажется, работает хорошо, но я не эксперт по регулярным выражениям! Кто-нибудь замечает какие-либо проблемы?

Ответы [ 6 ]

69 голосов
/ 26 августа 2009

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

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

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

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

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

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

/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/
16 голосов
/ 28 ноября 2012

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

?>
10 голосов
/ 26 августа 2009

1001 * попробовать *

function validate_alphanumeric_underscore($str) 
{
    return preg_match('/^[a-zA-Z0-9_]+$/',$str);
}
3 голосов
/ 26 августа 2009

выглядит хорошо для меня. Обратите внимание, что вы не предъявляете никаких требований к расположению подчеркивания, поэтому «username_» и «___username» будут оба пропущены.

1 голос
/ 14 января 2013

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

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

0 голосов
/ 26 августа 2009

Ваше собственное решение прекрасно.

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

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

( источник )

...