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

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

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

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

Ответ 1

Вы должны поместить ваше регулярное выражение /^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-]+$/, который соответствует символу слова (включая символы подчеркивания, буквы и цифры) или тире, одно или несколько раз.

Ответ 2

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

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

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

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

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

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

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

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

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

Ответ 3

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

/^ [\ ш -] + $/

Ответ 4

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

Ответ 5

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

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

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