<?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 => 'pt_BR',
  ),
  'this' => 
  array (
    0 => 'regexp.reference.subpatterns.php',
    1 => 'Sub-express&otilde;es',
    2 => 'Sub-express&otilde;es',
  ),
  'up' => 
  array (
    0 => 'reference.pcre.pattern.syntax.php',
    1 => 'Sintaxe das express&otilde;es regulares PCRE',
  ),
  'prev' => 
  array (
    0 => 'regexp.reference.internal-options.php',
    1 => 'Configura&ccedil;&atilde;o de op&ccedil;&otilde;es dentro da express&atilde;o',
  ),
  'next' => 
  array (
    0 => 'regexp.reference.repetition.php',
    1 => 'Repeti&ccedil;&atilde;o',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'pt_BR',
    '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">Sub-expressões</h2>
  <p class="para">
   Sub-expressões são delimitadas por parênteses
   e podem ser aninhadas. Marcar parte de uma expressão como uma sub-expressão
   tem dois objetivos:
  </p>
  <ol type="1">
   <li class="listitem">
    <p class="para">
     Localizar um conjunto de alternativas. Por exemplo, a expressão
     <code class="literal">cat(aract|erpillar|)</code> corresponde a uma das três palavras: &quot;cat&quot;,
     &quot;cataract&quot; ou &quot;caterpillar&quot;. Sem os parênteses, corresponderia a
     &quot;cataract&quot;, &quot;erpillar&quot; ou a uma string vazia.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Definir a sub-expressão como um grupo de captura (como definido acima).
     Quando toda a expressão tem correspondência, a parte da string de entrada
     que correspondeu à sub-expressão é passada de volta à função chamadora através
     do argumento <em>ovector</em> da função <span class="function"><strong>pcre_exec()</strong></span>.
     Parênteses de abertura são contados da esquerda para a direita (iniciando de 1) para
     obter os números dos grupos de captura.
    </p>
   </li>
  </ol>
  <p class="para">
   Por exemplo, se a string &quot;the red king&quot; é correspondida pela
   expressão

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

   os grupos de captura são &quot;red king&quot;, &quot;red&quot; e &quot;king&quot;,
   e são numerados com 1, 2 e 3.
  </p>
  <p class="para">
   O fato dos parênteses terem duas funções nem
   sempre ajuda. Frequentemente é necessária uma sub-expressão de
   agrupamento sem a necessidade de captura. Se um parêntese
   de abertura for seguido por &quot;?:&quot;, a sub-expressão não
   faz nenhuma captura, e não é contado ao computar o
   número de sub-expressões de captura subsequentes. Por exemplo,
   se a string &quot;the white queen&quot; é correspondida pela
   expressão

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

   as substrings capturadas são &quot;white queen&quot; e &quot;queen&quot;, e
   são numeradas com 1 e 2. O número máximo de subtrings capturadas
   é 65535. Porém, pode não ser possível compilar expressões deste tamanho,
   dependendo das opções de configuração da biblioteca libpcre.
  </p>
  <p class="para">
   Como um atalho conveniente, se qualquer configuração de opção for
   necessária no início de uma sub-expressão sem captura, as
   letras de opções podem aparecer entre o &quot;?&quot; e o &quot;:&quot;. Assim,
   as duas expressões
  </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">
   correspondem exatamente ao mesmo conjunto de strings. Como os ramos
   alternativos são testados da esquerda para a direita, e as opções não são
   redefinidas até que se alcance o final da sub-expressão, uma configuração
   de opção em um ramo não afeta ramos subsequentes, portanto
   as expressões acima correspondem a &quot;SUNDAY&quot; e também a &quot;Saturday&quot;.
  </p>

  <p class="para">
   É possível nomear uma sub-expressão usando a sintaxe
   <code class="literal">(?P&lt;nome&gt;expressão)</code>. Esta sub-expressão será então
   indexada no array de correspondências pela sua posição numérica normal e
   também pelo nome. Há duas sintaxes alternativas:
   <code class="literal">(?&lt;nome&gt;expressão)</code> e <code class="literal">(?&#039;nome&#039;expressão)</code>.
  </p>

  <p class="para">
   Algumas vezes é necessário ter correspondências múltiplas, mas não ter
   sub-grupos alternados em uma expressão regular. Normalmente, cada um destes receberia
   seu próprio número de referência embora apenas um seria
   possivelmente correspondido. Para contornar isto, a sintaxe <code class="literal">(?|</code> permite
   ter números duplicados. Considere o caso abaixo, onde a expressão regular corresponde à
   string <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">
   Aqui, <code class="literal">Sun</code> é armazenado na referência 2, enquanto que
   a referência 1 está vazia. Corresponder <code class="literal">Saturday</code> gera
   a referência 1 para <code class="literal">Sat</code> enquanto que a referência 2
   não existirá. Modificar a expressão usando <code class="literal">(?|</code> corrige
   este problema:
  </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">
   Usando esta expressão, tanto <code class="literal">Sun</code> quanto <code class="literal">Sat</code>
   seriam armazenadas na referência 1.
  </p>
 </div><?php manual_footer($setup); ?>