<?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.repetition.php',
    1 => 'Repeti&ccedil;&atilde;o',
    2 => 'Repeti&ccedil;&atilde;o',
  ),
  'up' => 
  array (
    0 => 'reference.pcre.pattern.syntax.php',
    1 => 'Sintaxe das express&otilde;es regulares PCRE',
  ),
  'prev' => 
  array (
    0 => 'regexp.reference.subpatterns.php',
    1 => 'Sub-express&otilde;es',
  ),
  'next' => 
  array (
    0 => 'regexp.reference.back-references.php',
    1 => 'Refer&ecirc;ncias retroativas',
  ),
  '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.repetition" class="section">
  <h2 class="title">Repetição</h2>
  <p class="para">
   Repetição é especificada por quantificadores, que podem acompanhar qualquer
   dos itens abaixo:

   <ul class="itemizedlist">
    <li class="listitem"><span class="simpara">um único caractere, possivelmente escapado</span></li>
    <li class="listitem"><span class="simpara">o metacaractere &quot;.&quot;</span></li>
    <li class="listitem"><span class="simpara">uma classe de caracteres</span></li>
    <li class="listitem"><span class="simpara">uma referência retroativa (veja a próxima seção)</span></li>
    <li class="listitem"><span class="simpara">uma sub-expressão entre parênteses (a menos que seja uma afirmação -
     veja abaixo)</span></li>
   </ul>
  </p>
  <p class="para">
   O quantificador de repetição geral especifica um número
   mínimo e um máximo de correspondências permitidas, informando os dois
   números dentro de chaves e separados por uma vírgula.
   Os números precisam ser menores que 65536, e o primeiro precisa ser
   menor ou igual ao segundo. Por exemplo:

   <code class="literal">z{2,4}</code>

   corresponde a &quot;zz&quot;, &quot;zzz&quot; ou &quot;zzzz&quot;. Um fechamento de chave em si
   não é um caractere especial, Se o segundo número for omitido,
   mas a vírgula estiver presente, não há limite superior; se o
   segundo número e a vírgula são ambos omitidos, o quantificador
   especifica um número exato de correspondências requeridas. Assim,

   <code class="literal">[aeiou]{3,}</code>

   corresponde a pelo menos 3 vogais sem acento sucessivas, mas também podem corresponder a
   muito mais, enquanto que

   <code class="literal">\d{8}</code>

   corresponde a exatamente 8 dígitos.

  </p>
  <p class="simpara">
   Antes do PHP 8.4.0, uma chave de abertura que
   aparece em uma posição onde um quantificador não é permitido, ou
   que não corresponda à sintaxe de um quantificador, é considerada
   como um caractere literal, Por exemplo, <code class="literal">{,6}</code>
   não é um quantificador, mas uma string literal de quatro caracteres.

   A partir do 8.4.0, a extensão PCRE é incluída com o PCRE2 versão 10.44,
   que permite expressões como <code class="literal">\d{,8}</code> e elas são
   interpretadas como <code class="literal">\d{0,8}</code>.

   Além disso, a partir do PHP 8.4.0, caracteres de espaço em torno de quantificadores como em
   <code class="literal">\d{0 , 8}</code> e <code class="literal">\d{ 0 , 8 }</code> são permitidos.
  </p>
  <p class="para">
   O quantificador {0} é permitido, fazendo com que a expressão se
   comporte como se o item anterior e o quantificador não estivessem
   presentes.
  </p>
  <p class="para">
   Para conveniência (e compatibilidade histórica), os três
   quantificadores mais comuns têm abreviaturas de apenas um caractere:

   <table class="doctable table">
    <caption><strong>Quantificadores de um caractere</strong></caption>
    
     <tbody class="tbody">
      <tr>
       <td><code class="literal">*</code></td>
       <td>equivalente a <code class="literal">{0,}</code></td>
      </tr>

      <tr>
       <td><code class="literal">+</code></td>
       <td>equivalente a <code class="literal">{1,}</code></td>
      </tr>

      <tr>
       <td><code class="literal">?</code></td>
       <td>equivalente a <code class="literal">{0,1}</code></td>
      </tr>

     </tbody>
    
   </table>

  </p>
  <p class="para">
   É possível construir laços de repetição infinitos acompanhando uma
   sub-expressão que pode corresponder a nenhum caractere com um quantificador
   que não tem limite superior, por exemplo:

   <code class="literal">(a?)*</code>
  </p>
  <p class="para">
   Versões mais antigas do Perl e do PCRE costumavam emitir um erro em
   tempo de compilação para tais expressões. No entanto, por haver
   casos onde isto pode ser útil, essas expressões agora são
   aceitas, mas se alguma repetição na sub-expressão de
   fato corresponder a nenhum caractere, o laço é quebrado à força.
  </p>
  <p class="para">
   Por padrão, os quantificadores são &quot;gananciosos&quot;, isto é, eles irão
   corresponder ao máximo de caracteres possível (até o limite do número
   máximo permitido), sem fazer com que o resto da expressão
   falhe. O exemplo clássico de onde isso dá problema é a
   tentativa de correspondência de comentários nos programas em linguagem C. Eles aparecem entre
   as sequências /* e */ e dentro da sequência, caracteres individuais
   * e / podem aparecer. Uma tentativa de corresponder a comentários C
   aplicando a expressão

   <code class="literal">/\*.*\*/</code>

   à string

   <code class="literal">/* primeiro comentário */ não comentário /* segundo comentário */</code>

   falha, porque ela corresponde à string completa devido à
   ganância do item &quot;.*&quot;.
  </p>
  <p class="para">
   Porém, se um quantificador for seguido por um ponto de interrogação,
   ele se torna preguiçoso, e agora irá corresponder ao mínimo número
   de vezes possível, e portanto a expressão

   <code class="literal">/\*.*?\*/</code>

   faz o certo com os comentários C. O significado dos
   vários quantificadores não é alterado, apenas o número
   preferido de correspondências. Não confunda este uso do
   ponto de interrogação com o seu uso como um quantificador em si.
   Como ele tem dois usos, pode algumas vezes aparecer duplicado, como
   em

   <code class="literal">\d??\d</code>

   que corresponde a um dígito por preferência, mas pode corresponder a dois se
   esta for a única maneira que o resto da expressão terá correspondência.
  </p>
  <p class="para">
   Se a opção <a href="reference.pcre.pattern.modifiers.php" class="link">PCRE_UNGREEDY</a>
   estiver definida (uma opção que não está
   disponível no Perl), os quantificadores não serão gananciosos por
   padrão, mas os individuais podem se tornar gananciosos inserindo-se um
   ponto de interrogação na sequência deles. Em outras palavras, o ponto de interrogação inverte
   o comportamento padrão.
  </p>
  <p class="para">
   Quantificadores seguidos por <code class="literal">+</code> são &quot;possessivos&quot;. Eles consomem
   o máximo de caracteres possível e não retornam para corresponder ao restante da
   expressão. Assim, <code class="literal">.*abc</code> corresponde a &quot;aabc&quot; mas
   <code class="literal">.*+abc</code> não, porque <code class="literal">.*+</code> consome a
   string inteira. Quantificadores possessivos podem ser usados para acelerar o processamento.
  </p>
  <p class="para">
   Quando uma sub-expressão entre parênteses é quantificada com uma contagem
   mínima de repetições maior que um ou com um máximo limitado,
   mais espaço de armazenamento é necessário para a expressão compilada, em
   proporção ao tamanho do mínimo ou do máximo.
  </p>
  <p class="para">
   Se uma expressão começa com .* ou .{0,} e a opção <a href="reference.pcre.pattern.modifiers.php" class="link">PCRE_DOTALL</a>
   (equivalente ao /s do Perl) está definida, assim permitindo que o &quot;.&quot;
   corresponda a caracteres de nova linha, a expressão estará implicitamente ancorada,
   porque qualquer coisa que estiver na sequência será testada em cada posição
   de caractere na string de entrada. Portanto, não faz sentido
   tentar novamente a correspondência geral em qualquer posição após a primeira.
   O PCRE trata tal expressão como se ela estivesse precedida por \A.
   Em casos onde é sabido que a string de entrada não contém
   caracteres de nova linha, vale a pena configurar <a href="reference.pcre.pattern.modifiers.php" class="link">PCRE_DOTALL</a> quando a
   expressão inicia com .* para
   obter esta otimização, ou
   alternativamente usar ^ para indicar a ancoragem explicitamente.
  </p>
  <p class="para">
   Quando uma sub-expressão de captura é repetida, o valor capturado
   é a substring que correspondeu à iteração final. Por exemplo, depois que

   <code class="literal">(tweedle[dume]{3}\s*)+</code>

   tenha correspondido a &quot;tweedledum tweedledee&quot; o valor da substring
   capturada é &quot;tweedledee&quot;. Porém se houver
   sub-expressões de captura aninhadas, os valores de captura
   correspondentes podem ter sido definidos em iterações prévias. Por exemplo,
   depois que

   <code class="literal">/(a|(b))+/</code>

   corresponder a &quot;aba&quot; o valor da segunda substring capturada é
   &quot;b&quot;.
  </p>
 </div><?php manual_footer($setup); ?>