Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Введение в СУБД HyTech.doc
Скачиваний:
11
Добавлен:
01.03.2025
Размер:
2.67 Mб
Скачать

Подшаблоны

Далее рассмотрим понятие подшаблона. Подшаблон внутри шаблона размещается между парой круглых скобок. Подшаблоны могут быть вложенными. Основное использование подшаблонов – задание альтернативных вариантов для алгоритма сравнения. Альтернативные варианты разделяются символом |.

Примеры:

Шаблон 

Описание 

/Иванов (Иван|Петр|Павел)/

Подстроки: Иванов Иван, Иванов Петр, Иванов Павел.

/(Mr\.|Dr\.)\s+[А-Я][А-Яа-я]+\s

Найти подстроки, начинающиеся с Mr. или Dr. после чего идут пробелы, затем заглавная русская буква, затем русские буквы и пробел.

Если за подшаблоном идет символ повтора, то повтор распространяется на весь подшаблон.

Другое назначение подшаблонов – поиск подстрок, удовлетворяющих подшаблону. Функция preg_match_all умеет искать такие подстроки. Двумерный массив, в который помещены результаты поиска, в 0-элементе содержит подстроки, удовлетворяющие основному шаблону, в 1-ом - первому подшаблону, во 2-ом - второму подшаблону и т.д. Для того, чтобы подшаблон не включался в результирующий массив после круглой скобки, открывающей подшаблон, должны идти символы ?:.

Пример:

<?php $pattern = "/Иванов (Иван|Петр|Павел)/"; $str1 = "Здравствуйте, Иванов Петр"; $cnt = preg_match_all($pattern, $str1, $result); foreach( $result as $k => $val ) {   echo "Элемент: {$k} ";   foreach( $val as $s )   {     // выводим сначала "Иванов Петр" для элемента $result с ключом 0     // затем "Петр" для элемента $result с ключом 1     echo "$s";   } } $pattern = "/Иванов (?:Иван|Петр|Павел)/"; $cnt = preg_match_all($pattern, $str1, $result); foreach( $result as $k => $val ) {   echo "Элемент: {$k} ";   foreach( $val as $s )   {     // выводим ТОЛЬКО "Иванов Петр" поскольку в подшаблоне указано "?:"     echo "$s";   } } ?>

Модификаторы

Ранее мы упоминали, что в регулярном выражении помимо шаблона присутствует модификатор. Модификатор определяет дополнительное поведение алгоритма сравнения и указывается после разделителя.

Примеры модификаторов:

Шаблон

Описание

/(Иван|Петр|Павел)/i

Модификатор i используется для указания того, что распознаваемые символы могут быть в любом регистре. Так, например, будут распознаны и строка Петр и строка ПЕТР.

/<body>.*<\/body>/m

Модификатор m используется для того, чтобы указать, что анализируется строка, которая может состоять из нескольких линий (т.е. представляет из себя многострочный текст).

/<body>.*<\/body>/s

Модификатор s используется для указания того, что символ . означает любой символ (включая перевод строки \n). В примере будет распознан многострочный текст.

В одном выражении могут быть указаны несколько модификаторов. В качестве разделителя / шаблона и модификатора могут использоваться помимо символа / еще |, !.

Если после символа разделителя в начале шаблона стоит символ ^, то ищется единственная подстрока, находящаяся в начале исходной строки. Если перед символом разделителя в конце шаблона стоит символ $, то ищется единственная подстрока, находящаяся в конце исходной строки.

Примеры:

Шаблон

Что распознаем

/ ^Иван/

В строке Иван Иванов найдем единственную подстроку Иван, хотя их две.

/ ^\d+/

В строке 123 456 найдем только 123.

/\d+$/

В строке 123 456 найдем только 456.

Для демонстрации возможностей регулярных выражений приведем следующие примеры:

Шаблон

Что распознаем

/^\w+([\.\w]+)*\w@\w((\.\w)*\w+)*\.\w{2,3}$/

Корректный адрес электронной почты.

/<body.*?>[\n\s]*<h1>(.*?)<\/h1>[\n\s]*/m

Заголовок HTML страницы (его распознает подшаблон (.*?)).