Нужно регулярное выражение, которое проверит, состоит ли строка только из букв a-z и цифр, подчеркивания (_) и дефиса (-) - PullRequest
11 голосов
/ 03 августа 2009

Я ищу регулярное выражение, которое проверит, состоит ли строка только из букв a-z, цифр, подчеркивания (_) и дефиса (-). Я пробовал это, но это не работает:

if (!preg_match('/^a-zA-Z0-9_-$/', $string)) {
  $reg_Error[] = 2;
}

Кроме того, я могу проверить длину с помощью регулярного выражения? Если нет, я просто сделаю это с PHP.

Ответы [ 5 ]

15 голосов
/ 03 августа 2009

Вы должны поместить свое регулярное выражение /^a-zA-Z0-9_-$/ в класс символов /[...]/.
Это означает, что вы можете сопоставить любой символ в классе символов. Вы также должны указать квантификатор, потому что /^[a-zA-Z0-9_-]$/ будет соответствовать только одному символу.

Примеры:
/^[a-zA-Z0-9_-]+$/ со знаком +, которому вы соответствуете один или несколько раз
/^[a-zA-Z0-9_-]{1,}$/ так же, как указано выше
/^[a-zA-Z0-9_-]{10,20}$/ длиной от 10 до 20 символов.
/^[a-zA-Z0-9_-]{15}$/ должно быть в точности 15 символов. Вы можете использовать его для проверки длины строки.

Вы также можете использовать следующее ключевое слово для удобства чтения вашего регулярного выражения:
/^[\w-]+$/, который соответствует символу слова (включая подчеркивание, буквы и цифры) или тире, один или несколько раз.

6 голосов
/ 03 августа 2009

Я бы использовал это:

/^[a-z_\-\d]+$/i

Что касается того, почему я не использую \w, следующая цитата, взятая из PHP PCRE Pattern Reference , должна объяснить, почему вы не должны использовать \w в этой ситуации

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

Такое поведение нежелательно в этом случае, поэтому, если вы не хотите беспокоиться о локали, используйте классы прямых символов вместо \w.

Если вы хотите указать минимальную длину (например, 3):

/^[a-z_\-\d]{3,}$/i

Если вы хотите указать минимальную и максимальную длину (например, 2 и 5):

/^[a-z_\-\d]{2,5}$/i
4 голосов
/ 03 августа 2009

Самый короткий:

/ ^ [\ ш -] + $ /

2 голосов
/ 03 августа 2009

Регулярное выражение должно быть: '^ [\ w \ d -] + $'

1 голос
/ 03 августа 2009

Ответы до сих пор правильно объясняют класс персонажа / ^[A-Za-z0-9_-]+$ /

Вы можете проверить длину. + означает «один или несколько предшествующих», * означает ноль или более предшествующих », а {2,4} означает« между 2 и 4 предшествующими ».

Вы не можете указать длину, которая должна быть простой. Указание, что длина должна быть четной, возможно, но нетривиально: / ^(xx){1,3}$ / соответствует xx, xxxx или xxxxxx. Количество здесь относится к количеству пар , а не к числу x'es

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...