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

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

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

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

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

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

 /^[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 

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

/ ^ [\ Ш -] + $ /

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

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

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

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