Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 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 - сопоставить символ "слова" (буквенно-цифровой плюс "_" )

(источник)