Далее рассмотрим понятие подшаблона. Подшаблон внутри шаблона размещается между парой круглых скобок. Подшаблоны могут быть вложенными. Основное использование подшаблонов – задание альтернативных вариантов для алгоритма сравнения. Альтернативные варианты разделяются символом |.
Примеры:
| Шаблон
| Описание
|
| /Иванов (Иван|Петр|Павел)/
| Подстроки: Иванов Иван, Иванов Петр, Иванов Павел.
|
| /(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";
}
}
?>