<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/reference.pcre.pattern.syntax.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'regexp.reference.subpatterns.php',
    1 => 'Подшаблоны',
    2 => 'Подшаблоны',
  ),
  'up' => 
  array (
    0 => 'reference.pcre.pattern.syntax.php',
    1 => 'Синтаксис регулярных выражений',
  ),
  'prev' => 
  array (
    0 => 'regexp.reference.internal-options.php',
    1 => 'Установка внутренних опций',
  ),
  'next' => 
  array (
    0 => 'regexp.reference.repetition.php',
    1 => 'Повторение',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'reference/pcre/pattern.syntax.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="regexp.reference.subpatterns" class="section">
  <h2 class="title">Подшаблоны</h2>
  <p class="para">
   Подшаблоны ограничивают круглыми скобками, которым разрешено быть вложенными.
   Пометка части шаблона как подшаблона выполняет две функции:
  </p>
  <ol type="1">
   <li class="listitem">
    <p class="para">
     Локализирует набор альтернатив. Например, шаблон
     <code class="literal">cat(aract|erpillar|)</code> соответствует одному из слов «cat»,
     «cataract» или «caterpillar». Без скобок он соответствовал
     бы строкам «cataract», «erpillar» или пустой строке.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Настраивает подшаблон как подшаблон захвата подстроки, как показывает первый пункт.
     Функция модуля PCRE <span class="function"><strong>pcre_exec()</strong></span> через аргумент <em>ovector</em>
     возвращает вызывающей функции подстроку, которая соответствует подшаблону,
     когда совпадает полный шаблон.
     Функция подсчитывает открывающие круглые скобки с единицы слева направо,
     чтобы получить количество захватывающих подшаблонов.
    </p>
   </li>
  </ol>
  <p class="para">
   Например, если строка «the red king» сопоставляется с шаблоном

   <code class="literal">the ((red|white) (king|queen))</code>,

   парсер захватит подстроки «red king», «red» и «king» с номерами 1, 2 и 3
   соответственно.
  </p>
  <p class="para">
   В реальной жизни выполнение одновременно двух функций может оказаться неудобным.
   Бывают случаи, когда нужна группировка альтернатив без захвата строки.
   Если после открывающей круглой скобки идут символы «?:», захват строки
   не происходит, и текущий подшаблон не нумеруется.
   Например, если строка «the white queen» сопоставляется с шаблоном

   <code class="literal">the ((?:red|white) (king|queen))</code>,

   парсер захватит подстроки «white queen» и «queen» и пронумерует подстроки числами
   1 и 2 соответственно. Максимальное количество захватывающих подшаблонов — 65 535.
   Такие большие шаблоны могут не скомпилироваться, в зависимости от настроек модуля libpcre.
  </p>
  <p class="para">
   Если в незахватывающем подшаблоне нужно указать дополнительные
   опции, пользуются удобным сокращением: символ, который обозначает
   устанавливаемую опцию, помещается между «?» и «:».
   Таким образом, следующие два шаблона
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="annotation-interactive cdata"><pre>
(?i:saturday|sunday)
(?:(?i)saturday|sunday)
</pre></div>
   </div>

  </div>

  <p class="para">
   соответствуют одному и тому же набору строк. Поскольку альтернативные
   версии берутся слева направо, и установленные опции сохраняют своё
   действие до конца подшаблона, опция, установленная в одной ветке, также
   имеет эффект во всех последующих ветках. Поэтому приведённые шаблоны
   совпадают как с «SUNDAY», так и с «Saturday».
  </p>

  <p class="para">
   Именованные подшаблона задают синтаксисом
   <code class="literal">(?P&lt;name&gt;pattern)</code>. Этот подшаблон будет индексирован
   в массиве совпадений кроме обычного числового индекса, ещё и по имени name.
   Именованные подшаблоны записывают двумя альтернативными синтаксисами:
   <code class="literal">(?&lt;name&gt;pattern)</code> и <code class="literal">(?&#039;name&#039;pattern)</code>.
  </p>

  <p class="para">
   Иногда необходимо иметь несколько совпадений, которые исключают друг друга.
   Обычно, каждое такое совпадение получает свой собственный номер, даже
   если шаблон разрешает совпасть только одному из них.
   Синтаксис <code class="literal">(?|</code> даёт обойти это поведение и убрать
   дублирующиеся номера. Рассмотрим следующее регулярное выражение,
   сопоставленное со строкой <code class="literal">Sunday</code>:
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="annotation-interactive cdata"><pre>(?:(Sat)ur|(Sun))day</pre></div>
   </div>

  </div>

  <p class="para">
   Здесь парсер сохраняет значение <code class="literal">Sun</code> в ссылке 2, тогда как
   ссылка 1 пуста. В результате сопоставления <code class="literal">Saturday</code>
   в обратной ссылке 1 появляется <code class="literal">Sat</code>,
   в то время как обратная ссылка 2 не существует.
   Запись <code class="literal">(?|</code> в шаблоне решает эту проблему:
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="annotation-interactive cdata"><pre>(?|(Sat)ur|(Sun))day</pre></div>
   </div>

  </div>

  <p class="para">
   В этом шаблоне оба подшаблона <code class="literal">Sun</code> и <code class="literal">Sat</code>
   парсер сохранят под номером 1.
  </p>
 </div><?php manual_footer($setup); ?>