function isUserID($username) {
if (preg_match('/^[a-z\d_]{2,20}$/i', $username)) {
return true;
} else {
return false;
}
}
Легкий.., у меня есть это, можно ли объяснить, на что это проверяет? Я знаю, что это проверяет, имеет ли имя пользователя длину между 2-20, что больше?Спасибо
Ищет текст, содержащий только алфавитно-цифровые символы и символы подчеркивания, длиной от 2 до 20 символов.
/^[a-z\d_]{2,20}$/i |||| | ||| ||| |||| | ||| ||i : case insensitive |||| | ||| |/ : end of regex |||| | ||| $ : end of text |||| | ||{2,20} : repeated 2 to 20 times |||| | |] : end character group |||| | _ : underscore |||| \d : any digit |||a-z: 'a' through 'z' ||[ : start character group |^ : beginning of text / : regex start
Он буквально проверяет, состоит ли $ username
из последовательность от 2 до 20 символов a
- z
, A
- Z
(из-за i флаг нечувствительности к регистру), 0
- 9
(для \ d
) и _
.
Он проверяет, состоит ли имя пользователя из 2-20 символов, которые являются буквами (в верхнем или нижнем регистре благодаря флагу i
), числами или знаком подчеркивания.
Это можно сократить двумя способами: во-первых, конструкция if
не нужна. Во-вторых, вы можете использовать \ w
в качестве замены тех же символов, поэтому:
function isUserID($username) {
return preg_match('/^\w{2,20}$/', $username);
}
/^[a-z\d_]{2,20}$/i
Разделитель:
/
- это разделитель regex; вы можете выбрать что угодно, но чаще всего используется прямая косая черта.
^
означает "соответствовать началу ввода": Следующее выражение должно быть в начале, чтобы регекс совпал.
[a-z\d_]
- это класс символов; он означает 'любой из символов между квадратными скобками'; обратная косая черта в сочетании с d является сокращением для 'цифр', а тире указывает на диапазон включительно; таким образом, класс символов означает 'любая буква или цифра, или подчеркивание'.
{2;20}
- это квантификатор, который говорит, что предыдущее выражение (класс символов) должно повторяться от 2 до 20 раз.
$
означает 'совпадение с концом ввода', аналогично ^.
Еще один /
завершает сам regex; далее следуют опции процессинга, в данном случае i
, что означает 'нечувствительность к регистру'.
Идет проверка алфавитно-цифрового слова длиной 2-20 символов, состоящего из букв, цифр и _
Он также проверяет, содержит ли он какие-либо символы, кроме алфавита, a-z и A-Z, цифр 0-9 и _.
Или можно сказать, что проверяется, содержит ли он только алфавитно-цифровые символы и _.
Это можно переписать и попроще - preg_match возвращает int, поэтому нет причин использовать шаблон 'return false, return true'.
function isUserID($username){ return (bool)preg_match('/^[a-z\d_]{2,20}$/i', $username); }
Получится то же самое.
Также, \w
означает то же самое, что и эти символы. Буквы, цифры и знак подчеркивания. Так что еще лучше будет
function isUserID($username){ return (bool)preg_match('/^[\w]{2,20}$/i', $username); }