<?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 => 'fr',
  ),
  'this' => 
  array (
    0 => 'regexp.reference.assertions.php',
    1 => 'Assertions',
    2 => 'Assertions',
  ),
  'up' => 
  array (
    0 => 'reference.pcre.pattern.syntax.php',
    1 => 'Fonctionnement des expressions r&eacute;guli&egrave;res',
  ),
  'prev' => 
  array (
    0 => 'regexp.reference.back-references.php',
    1 => 'R&eacute;f&eacute;rences arri&egrave;res',
  ),
  'next' => 
  array (
    0 => 'regexp.reference.onlyonce.php',
    1 => 'Sous-masques uniques',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    '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">Assertions</h2>
  <p class="para">
   Une assertion est un test sur les caractères suivants ou
   précédents celui qui est en cours d&#039;étude. Ce
   test ne consomme pas de caractères (ie, on ne déplace
   pas le pointeur de caractères). Les assertions simples sont
   codées avec <code class="literal">\b</code>, <code class="literal">\B</code>,
   <code class="literal">\A</code>, <code class="literal">\Z</code>, <code class="literal">\z</code>,
   <code class="literal">^</code> et <code class="literal">$</code>, et sont décrites
   dans les <a href="regexp.reference.escape.php" class="link">séquences d&#039;échappement</a>.
   Il existe cependant des types d&#039;assertions plus complexes, codées sous la forme
   de sous-masques. Il en existe deux types : celles qui travaillent
   <em>au-delà</em> de la position courante, et celles qui
   travaillent <em>en-deçà</em>.
  </p>
  <p class="para">
   Une assertion se comporte comme un sous-masque, hormis le fait qu&#039;elle
   ne déplace pas le pointeur de position. Les <em>assertions avant</em>
   commencent par <code class="literal">(?=</code> pour les assertions positives, et
   par <code class="literal">(?!</code>, pour les assertions négatives. Par exemple :
   
   <code class="literal">\w+(?=;)</code>
   
   s&#039;assure qu&#039;un mot est suivi d&#039;un point-virgule,
   mais n&#039;inclut pas le point virgule dans la capture et <code class="literal">foo(?!bar)</code>
   trouve toutes les occurrences de &quot;foo&quot; qui ne sont pas suivies par &quot;bar&quot;.
   À noter que,
   
   <code class="literal">(?!foo)bar</code>
   
   en est proche, mais ne trouve pas une
   occurrence de &quot;<code class="literal">bar</code>&quot; qui soit précédée
   par quelque chose d&#039;autre que &quot;<code class="literal">foo</code>&quot;; il
   trouve toutes les occurrences de &quot;<code class="literal">bar</code>&quot;,
   quel que soit ce qui le précède, car l&#039;assertion
   
   <code class="literal">(?!foo)</code>
   
   est toujours vraie quand les trois caractères suivants sont
   &quot;<code class="literal">bar</code>&quot;. Une assertion arrière est ici
   nécessaire.
  </p>
  <p class="simpara">
   Les <em>assertions</em> arrières commencent par <code class="literal">(?&lt;=</code>
   pour les assertions positives, et <code class="literal">(?&lt;!</code> pour les
   assertions négatives. Par exemple :

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

   trouve les occurrences de &quot;<code class="literal">bar</code>&quot; qui ne sont pas
   précédées par &quot;<code class="literal">foo</code>&quot;. Une assertion arrière peut
   correspondre à des chaînes de longueur variable, jusqu&#039;à une longueur
   maximale définie par l&#039;implémentation. Les alternatives de longueurs
   différentes, telles que

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

   et les alternatives au niveau supérieur pouvant correspondre à plus d&#039;une
   longueur, telles que

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

   sont autorisées.

   L&#039;implémentation des assertions arrière déplace
   temporairement le pointeur de position vers l&#039;arrière, et cherche
   à vérifier l&#039;assertion. S&#039;il n&#039;y a pas assez de caractères avant la
   position courante, l&#039;assertion échoue.
   La combinaison d&#039;assertions arrière avec des sous-masques à utilisation
   unique est particulièrement pratique pour effectuer une recherche en fin
   de chaîne ; un exemple est donné à la fin de la section sur les
   sous-masques à utilisation unique.
  </p>
  <p class="simpara">
   Avant PHP 8.4.0, qui intègre PCRE2 10.44, le contenu d&#039;une assertion
   arrière était limité de telle façon que les chaînes correspondantes
   devaient toujours avoir une longueur fixe. Si plusieurs alternatives
   étaient présentes, elles n&#039;avaient pas besoin d&#039;être de la même taille.
   Ainsi,

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

   était autorisé, mais

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

   provoquait une erreur de compilation. Les alternatives de longueurs
   différentes n&#039;étaient autorisées qu&#039;au niveau supérieur des assertions
   arrière. C&#039;était une amélioration par rapport à Perl 5.005, qui imposait
   à toutes les alternatives d&#039;avoir la même taille. Une assertion telle que

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

   n&#039;était pas autorisée, car son unique alternative au niveau supérieur
   pouvait correspondre à deux longueurs différentes. Pour la rendre
   acceptable, il fallait l&#039;écrire avec deux alternatives au niveau
   supérieur :

   <code class="literal">(?&lt;=abc|abde)</code>
  </p>
  <p class="para">
   Plusieurs assertions peuvent intervenir successivement. Par exemple,
   le masque
   
   <code class="literal">(?&lt;=\d{3})(?&lt;!999)foo</code>
   
   recherche les chaînes &quot;<code class="literal">foo</code>&quot; précédées
   par trois chiffres qui ne sont pas &quot;999&quot;. À noter que chaque assertion
   est appliquée indépendamment, au même point de
   la chaîne à traiter. Tout d&#039;abord, il est
   vérifié que les trois premiers caractères ont
   tous des chiffres, puis on s&#039;assure que ces trois caractères
   ne sont pas &quot;<code class="literal">999</code>&quot;. Le masque précédant
   n&#039;accepte pas &quot;<code class="literal">foo</code>&quot; précédé de
   6 caractères, les trois premiers étant des chiffres et
   les trois suivants étant différents de &quot;<code class="literal">999</code>&quot;.
   Par exemple, ce masque n&#039;acceptera pas la chaîne
   &quot;<code class="literal">123abcfoo</code>&quot;. Pour ce faire, il faut utiliser le masque
   suivant :
   
   <code class="literal">(?&lt;=\d{3}...)(?&lt;!999)foo</code>.
   
  </p>
  <p class="para">
   Dans ce masque, la première assertion vérifie les six premiers
   caractères, s&#039;assure que les trois premiers sont des chiffres,
   et la deuxième assertion s&#039;assure que les trois derniers
   caractères ne sont pas &quot;<code class="literal">999</code>&quot;.
  </p>
  <p class="para">
   De plus, les assertions peuvent être imbriquées :
   
   <code class="literal">(?&lt;=(?&lt;!foo)bar)baz</code>
   
   recherche les occurrences de &quot;<code class="literal">baz</code>&quot; qui sont
   précédées par &quot;<code class="literal">bar</code>&quot;, qui,
   à son tour, n&#039;est pas précédé par
   &quot;<code class="literal">foo</code>&quot;. Au contraire,
   
   <code class="literal">(?&lt;=\d{3}...(?&lt;!999))foo</code>
   
   est un autre masque, qui recherche les caractères &quot;<code class="literal">foo</code>&quot;,
   précédés par trois chiffres, suivis de trois
   autres caractères qui ne forment pas &quot;<code class="literal">999</code>&quot;.
  </p>
  <p class="para">
   Les assertions ne sont pas capturantes, et ne peuvent pas être
   répétées. Si une assertion contient des sous-masques
   capturants en son sein, ils seront compris dans le nombre de sous-masques
   capturants du masque entier. La capture n&#039;est cependant réalisée que pour
   les assertions positives, car cela n&#039;a pas de sens pour les
   assertions négatives.
  </p>
  <p class="para">
   Les assertions comptent dans le maximum de 200 sous-masques entre
   parenthèses.
  </p>
 </div><?php manual_footer($setup); ?>