<?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.assertions.php',
    1 => 'Afirma&ccedil;&otilde;es',
    2 => 'Afirma&ccedil;&otilde;es',
  ),
  'up' => 
  array (
    0 => 'reference.pcre.pattern.syntax.php',
    1 => 'Sintaxe das express&otilde;es regulares PCRE',
  ),
  'prev' => 
  array (
    0 => 'regexp.reference.back-references.php',
    1 => 'Refer&ecirc;ncias retroativas',
  ),
  'next' => 
  array (
    0 => 'regexp.reference.onlyonce.php',
    1 => 'Sub-express&otilde;es de ocorr&ecirc;ncia &uacute;nica',
  ),
  '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.assertions" class="section">
  <h2 class="title">Afirmações</h2>
  <p class="para">
   Uma afirmação é um teste nos caracteres posteriores ou
   anteriores ao ponto atual de correspondência que efetivamente não
   consome nenhum caractere. As afirmações simples codificadas como \b,
   \B, \A, \Z, \z, ^ e $ estão descritas na seção sobre <a href="regexp.reference.escape.php" class="link">sequências de escape</a>. Afirmações mais
   complexas são codificadas como sub-expressões. Existem dois
   tipos: aquelas que <em>olham para frente</em> da posição atual na
   string de entrada e aquelas que <em>olham para trás</em> dela.
  </p>
  <p class="para">
   Uma sub-expressão de afirmação é correspondida da maneira usual, exceto
   que ela não faz com que a posição atual de correspondência seja
   alterada. Afirmações que olham <em>para frente</em> iniciam com (?= para afirmações
   positivas e com (?! para afirmações negativas. Por exemplo,

   <code class="literal">\w+(?=;)</code>

   corresponde a uma palavra seguida por ponto-e-vírgula, mas não inclui
   o ponto-e-vírgula na correspondência, e

   <code class="literal">foo(?!bar)</code>

   corresponde a qualquer ocorrência de &quot;foo&quot; que não seja seguida por
   &quot;bar&quot;. Observe que a expressão aparentemente similar

   <code class="literal">(?!foo)bar</code>

   não encontra uma ocorrência de &quot;bar&quot; que seja precedida por
   algo além de &quot;foo&quot;; ela encontra qualquer ocorrência de &quot;bar&quot;
   de todo modo, porque a afirmação (?!foo) é sempre <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>
   quando os três próximos caracteres são &quot;bar&quot;. Uma afirmação que
   olha para trás é necessária para conseguir este efeito.
  </p>
  <p class="simpara">
   Afirmações que olham <em>para trás</em> iniciam com (?&lt;= para afirmações positivas
   e (?&lt;! para afirmações negativas. Por exemplo,

   <code class="literal">(?&lt;!foo)bar</code>

   encontra uma ocorrência de &quot;bar&quot; que não seja precedida por
   &quot;foo&quot;. Uma afirmação que olha para trás pode corresponder a strings de tamanhos
   variáveis, até um limite definido pela implementação.
   Alternativas de tamanhos diferentes como

   <code class="literal">(?&lt;!dogs?|cats?)</code>

   e ramos de nível superior que podem corresponder a mais que um comprimento como

   <code class="literal">(?&lt;=ab(c|de))</code>

  são permitidos.

   A implementação de afirmações que olham para trás é, para cada
   alternativa, mover temporariamente a posição atual para trás
   pela largura fixa e então tentar a correspodência. Se houver
   caracteres insuficientes antes da posição atual, a
   correspondência falhará. Afirmações que olham para trás em conjunção com
   sub-expressões de ocorrência única podem ser particularmente úteis para ter correspondência
   nos finais de strings; um exemplo é mostrado no final
   da seção sobre sub-expressões de ocorrência única.
  </p>
  <p class="simpara">
   Antes do PHP 8.4.0, que inclui o PCRE2 10.44, o conteúdo de uma afirmação
   que olha para trás era restrito de forma que todas as strings que ela correspondia tinham que ter um
   comprimento fixo. Se houvessem várias alternativas, nem todas elas precisavam ter
   o mesmo comprimento fixo, então

   <code class="literal">(?&lt;=bullock|donkey)</code>

   era permitido, mas

   <code class="literal">(?&lt;!dogs?|cats?)</code>

   causava um erro no momento da compilação. Ramos que correspondiam a strings
   de diferentes comprimentos eram permitidas somente no nível superior de
   uma afirmação que olha para trás. Isto era uma extensão comparado com o
   Perl 5.005, que requeria que todos os ramos correspondessem o mesmo
   comprimento de string. Um afirmação como

   <code class="literal">(?&lt;=ab(c|de))</code>

   não era permitida porque seu ramo superior único poderia
   corresponder a dois comprimentos diferentes mas era aceita se fosse reescrita
   para usar dois ramos de nível superior:

   <code class="literal">(?&lt;=abc|abde)</code>
  </p>
  <p class="para">
   Várias afirmações (de qualquer tipo) podem ocorrer sucessivamente.
   Por exemplo,

   <code class="literal">(?&lt;=\d{3})(?&lt;!999)foo</code>

   corresponde a &quot;foo&quot; precedida por três dígitos que não são &quot;999&quot;.
   Note que cada afirmação é aplicada independentemente
   no mesmo ponto da string de entrada. Primeiro é
   verificado se os três caracteres anteriores são todos dígitos
   e depois é verificado se os mesmos três caracteres não são
   &quot;999&quot;. Esta expressão não corresponde a &quot;foo&quot; precedida por seis
   caracteres, os primeiros três dos quais são dígitos e os últimos três
   deles não são &quot;999&quot;. Por exemplo, ela não corresponde a
   &quot;123abcfoo&quot;. Uma expressão para fazer isso é

   <code class="literal">(?&lt;=\d{3}...)(?&lt;!999)foo</code>
  </p>
  <p class="para">
   Agora a primeira afirmação olha para os seis caracteres
   precedentes, verificando se os primeiros três são dígitos e
   depois a segunda afirmação verifica se os três caracteres
   precedentes não são &quot;999&quot;.
  </p>
  <p class="para">
   Afirmações podem ser aninhadas em qualquer combinação. Por exemplo,

   <code class="literal">(?&lt;=(?&lt;!foo)bar)baz</code>

   corresponde a uma ocorrência de &quot;baz&quot; que é precedida por &quot;bar&quot;
   que por sua vez não é precedida por &quot;foo&quot;, enquanto que

   <code class="literal">(?&lt;=\d{3}...(?&lt;!999))foo</code>

   é outra expressão que corresponde a &quot;foo&quot; precedida por três
   dígitos e quaisquer três caracteres que não sejam &quot;999&quot;.
  </p>
  <p class="para">
   Sub-expressões de afirmação não são sub-expressões de captura, e podem
   não ser repetidas, porque não faz sentido afirmar a
   mesmo coisa várias vezes. Se qualquer tipo de afirmação coniver
   sub-expressões de captura dentro dela, estas são contadas para os
   propósitos de numeração dos grupos de captura em toda
   a expressão. Porém, a captura de substring acontece somente
   para afirmações positivas, porque não faz sentido para
   afirmações negativas.
  </p>
  <p class="para">
   Afirmações contam até o máximo de 200 sub-expressões
   entre parênteses.
  </p>
 </div><?php manual_footer($setup); ?>