В данном случае вам нужно следующее:
function isValid($str) {
return !preg_match('/[^A-Za-z0-9]/', $str);
}
Конструкция регулярного выражения […]
называется классом символов . Что-то вроде [aeiou]
соответствует одному из любых гласных.
[^…]
является классом символов с отрицанием , поэтому [^aeiou]
соответствует одному из чего угодно, кроме гласных (которые включают согласные, цифры, символы и т. Д.).
-
, в зависимости от того, где и как оно появляется в определении класса символов, является определением диапазона , поэтому 0-9
совпадает с 0123456789
.
Таким образом, регулярное выражение [^A-Za-z0-9]
фактически соответствует символу, который не является ни буквой, ни цифрой. Вот почему результат preg_match
сводится к нулю с !
.
То есть логика вышеуказанного метода использует двойное отрицание :
isValid = it's not the case that
there's something other than a letter or a digit
anywhere in the string
Вы также можете избавиться от двойного отрицания и использовать что-то вроде этого:
function isValid($str) {
return preg_match('/^[A-Za-z0-9]*$/', $str);
}
Теперь нет отрицания. ^
и $
являются началом и якорями строки, а *
является метасимволом повторения ноль или один. Теперь логика проста:
isValid = the entire string from beginning to end
is a sequence of letters and digits
Ссылки
Смежные вопросы
Альтернатива без регулярных выражений
В некоторых языках есть стандартные функции / идиоматические способы проверки того, что строка состоит только из буквенно-цифровых символов (среди других возможных строковых «типов»).
Например, в PHP вы можете использовать ctype_alnum
.
bool ctype_alnum ( string $text )
Проверяет, являются ли все символы в предоставленной строке, text
, буквенно-цифровыми.
API ссылки
- Функции PHP Ctype - список всего семейства функций
ctype
ctype_alpha
, digit
, lower
, upper
, space
и т. Д.