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

StackOverflow https://stackoverflow.com/questions/1330693

  •  19-09-2019
  •  | 
  •  

Вопрос

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

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);
}

Мне кажется, все в порядке.Обратите внимание, что вы не предъявляете никаких требований к размещению подчеркивания, поэтому оба «имя_пользователя_» и «___имя_пользователя» будут пройдены.

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

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

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

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

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

(источник)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top