2012-04-18 3 views
5

У меня есть это выражение в фрагменте кода, который я заимствовал в автономном режиме. Это заставляет новых пользователей иметь пароль, который требует не только номеров с верхним + нижним +, но они должны быть в таком порядке! Если я введу нижние + верхние + цифры, это не удастся!Что означают символы в preg_match?

if (preg_match("/^.*(?=.{4,})(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).*$/", $pw_clean, $matches)) { 

Ive искал в Интернете, но не может найти ресурс, который говорит мне, что означают некоторые символы. Я вижу, что шаблон - preg_match ("/ some expression /", yourstring, ваше совпадение).

Что они означают:

1.^  - ??? 
2. .*   - ??? 
3. (?=.{4,}) - requires 4 characters minimum 
4. (?.*[0-9]) - requires it to have numbers 
5. (?=.*[a-z])- requires it to have lowercase 
6. (?=.*[A-Z])- requires it to have uppercase 
7. .*$  - ??? 
+0

Поиск в Google для учебных пособий по реестру –

+0

Не связанный с вашим реальным вопросом, но заставляющий людей иметь слишком сложный шаблон для пароля, скорее всего, заставит их просто записать его где-нибудь - устраняя безопасность пароля. – jprofitt

+0

Поскольку вы помечаете этот PHP: http://php.net/manual/en/book.pcre.php –

ответ

13

Вот прямые ответы. Я держал их короткими, потому что они не будут иметь смысла без понимания регулярного выражения. Это понимание лучше всего получить на 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/

+0

Thx ccondrup. Думаю, я понимаю ваши объяснения, но если это не слишком много проблем, id как объяснение того, почему полное выражение работает так, как оно делает, чтобы так сильно усложнить мою проверку пароля ... – marciokoko

+0

Приятно было слышать, что это понятно. Я добавил больше к моему ответу, посмотрим, помогает ли это – ccondrup

+0

, что означает 'preg_match (. *?)'? – Neocortex

2

Если вы не знаете, этот сайт, вы должны пойти туда немедленно.

Это похоже на библию регулярных выражений.

Regular-expressions.info

1

Чтобы использовать регулярные выражения сначала нужно изучить синтаксис , Этот синтаксис состоит из серии букв, цифр, точек, дефисов и специальных знаков, которые мы можем группировать, используя разные круглые скобки.

Посмотрите на эту ссылку Getting Started with PHP Regular Expressions. Легкий способ изучения регулярных выражений.

Смежные вопросы