Урок 11. Подвыражения в шаблоне

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

От автора: в этом уроке мы познакомимся с логическим оператором ИЛИ, а также рассмотрим вопрос использования подвыражений в шаблоне.

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

По результатам урока Вы узнаете об использовании подвыражений в регулярных выражениях, а также о метасимволе, являющемся логическим оператором ИЛИ.

lesson

Все уроки курса:

Метки:

Комментарии (8)

  1. Вероника

    Спасибо за урок! Андрей, такой вопрос: в домашнем задании Вы используете метатеги начала и конца строки, как я понимаю, для выборки данных из какого-то текста или списка. Если же это регулярное выражение составлено для валидации введенных пользователем данных, правильнее ли использовать метатеги начала и конца слова? Ведь подразумевается, что номер карты, как и дата введется пользователем в поле формы только одной строкой, а не двумя или более. Или я ошибаюсь? Заранее спасибо.

    • Андрей Кудлай

      Пожалуйста, Вероника. В данном варианте мы как раз обязаны использовать метасимволы начала и конца строки. Тем самым мы провалидируем всю строку от начала до конца и гарантированно обеспечим получение именно номера карты, а не чего-либо еще. Когда мы валидируем данные из формы (логин, email, номер карты и т.д.), то мы всегда должны проверять всю строку, поэтому и используем символы ^ и $. Если их не использовать, тогда поле вполне пройдет валидацию, если там будет номер карты и кроме него что угодно еще… а этот вариант нас не устраивает.
      А вот примеры:
      1. Здесь мы не используем символы начала и конца строки, тем самым ищем что-то в строке, а не проверяем всю строку целиком. И это ошибочный вариант, поскольку строка пройдет валидацию, но кроме номера карты там есть лишние данные.
      2. Здесь мы уже используем метасимволы начала/конца строки, т.е. проверяем всю строку и она, как и положено, не проходит валидацию. При этом строка, в которой только номер карты, успешно валидируется.

  2. Ruson

    Скажите пожалуйста. Вы даете такой пример ^(\d{4} ?){3}\d{4}$ решения задачи. Почему бы не указать сразу четыре повторения вместо трех ^(\d{4} ?){4}$ Я протестил, вроде как результат идентичен, но возможно я чтото недопонимаю. Спасибо!

    • Андрей Кудлай

      Ваш шаблон пропустит номер карты в конце которого будет стоять пробел (вот такой номер пройдет «1111 2222 3333 4444 «). По условию задачи после последней цифры номера не должно быть ничего:

  3. Ruson

    Да, точно! Спасибо! =)

  4. Ruson

    У меня еще один вопрос по использованию подвыражений. Опять таки из Вашего примера где вы отбираете года. Я решил попробовать запустить через сервер, но почему то создается два массива с результатами. Во втором масиве непонятные даные. Тоде самое и с домашним заданием.
    Например:

    $string = '
    1950
    2000
    2100
    1899
    ';

    $pattern = '#(19|20)\d{2}#';

    preg_match_all($pattern, $string, $matches);
    echo "";
    print_r($matches);
    echo "";

    На выходе получаю:

    Array
    (
    [0] => Array
    (
    [0] => 1950
    [1] => 2000
    )

    [1] => Array
    (
    [0] => 19
    [1] => 20
    )

    )

    Это нормальное явление что создается второй массив внутри массива ?

    • Андрей Кудлай

      Да, так и должно быть, так работает функция preg_match_all: в первый элемент массива сохраняется строка, в которой найдено совпадение, во второй — само совпадение.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree