Вот прямые ответы. Я держал их короткими, потому что они не будут иметь смысла без понимания регулярного выражения. Это понимание лучше всего получить на regular-expressions.info. Я советую вам также опробовать regex helper tools, перечисленные там, они позволяют вам экспериментировать - см. Живое захват/сопоставление при редактировании рисунка, очень полезно.
1: Каретка ^
является якорь, это означает «начало стоге/строки/линии».
- Если каретка является первым символом внутри класса символов
[]
, это имеет другое значение: оно отрицает класс. (Таким образом, в [^ab]
каретка делает этот матч класса ничего, что не аб)
2: точка .
и звездочка *
служат две отдельных целей:
- Точка соответствует любому символу кроме новой строки
\n
.
- Звездочка говорит: «Разрешить ноль или многие из предшествующих типов».
Если эти два элемента объединены как .*
, он в основном считывает «ноль или больше всего, пока не вступит в силу новая строка или другое правило».
7: Доллар $
также является якорем, похожим на каретку, с противоположной функцией: «конец стога сена».
Edit:
Простые круглые скобки ()
вокруг что-то делает это группа. Здесь у вас есть (?=)
, который является утверждением, в частности, положительное утверждение вперед. Все, что он делает, - это проверить, существует ли то, что внутри существует, прямо из текущей позиции курсора в стоге сена. Все еще со мной?
Пример:foo(?=bar)
соответствует foo
, если только bar
. bar
никогда не соответствует, возвращается только foo
.
Имея это в виду, давайте проанализируем ваше регулярное выражение:
/^.*(?=.{4,})(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).*$/
Reads as:
^.* From Start, capture 0-many of any character
(?=.{4,}) if there are at least 4 of anything following this
(?=.*[0-9]) if there is: 0-many of any, ending with an integer following
(?=.*[a-z]) if there is: 0-many of any, ending with a lowercase letter following
(?=.*[A-Z]) if there is: 0-many of any, ending with an uppercase letter following
.*$ 0-many of anything preceding the End
Вы говорите, что порядок символов в пароле дело - это не в моих тестах. См. Тестовый сценарий ниже. Надеюсь, это прояснилось. Если вы ищете другое регулярное выражение, которое является немного более снисходительными, см regex password validation
<pre>
<?php
// Only the last 3 fail, as they should. You claim the first does not work?
$subjects = array("aaB1", "Baa1", "1Baa", "1aaB", "aa1B", "aa11", "aaBB", "aB1");
foreach($subjects as $s)
{
$res = preg_match("/^.*(?=.{4,})(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).*$/", $s, $matches);
echo "result: ";
print_r($res);
echo "<br>";
print_r($matches);
echo "<hr>";
}
Отличный интерактивный инструмент для проверки и тестирования регулярных выражений: https://regex101.com/
Поиск в Google для учебных пособий по реестру –
Не связанный с вашим реальным вопросом, но заставляющий людей иметь слишком сложный шаблон для пароля, скорее всего, заставит их просто записать его где-нибудь - устраняя безопасность пароля. – jprofitt
Поскольку вы помечаете этот PHP: http://php.net/manual/en/book.pcre.php –