<?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.subpatterns.php',
    1 => 'Sous-masques',
    2 => 'Sous-masques',
  ),
  'up' => 
  array (
    0 => 'reference.pcre.pattern.syntax.php',
    1 => 'Fonctionnement des expressions r&eacute;guli&egrave;res',
  ),
  'prev' => 
  array (
    0 => 'regexp.reference.internal-options.php',
    1 => 'Options internes',
  ),
  'next' => 
  array (
    0 => 'regexp.reference.repetition.php',
    1 => 'R&eacute;p&eacute;titions',
  ),
  '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.subpatterns" class="section">
  <h2 class="title">Sous-masques</h2>
  <p class="para">
   Les sous-masques sont délimités par des parenthèses,
   et peuvent être imbriqués. Ajouter des sous-masques a deux
   utilités :
  </p>
   <ol type="1">
   <li class="listitem">
    <p class="para">
     Localiser un ensemble d&#039;alternatives. Par exemple, le motif
     <code class="literal">cat(aract|erpillar|)</code> trouve un des mots &quot;cat&quot;,
     &quot;cataract&quot;, ou &quot;caterpillar&quot;. Sans les parenthèses, cela trouverait
     &quot;cataract&quot;, &quot;erpillar&quot; ou la chaîne vide.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Cela configure le sous-masque comme capturant. Lorsque tout le motif
     correspond, la portion de la sous-chaîne qui correspond au sous-masque
     est passé à l&#039;appelant grâce à l&#039;argument <em>ovector</em>
     de <span class="function"><strong>pcre_exec()</strong></span>. Les parenthèses ouvrantes sont comptées
     depuis la gauche vers la droite (commençant à 1) jusqu&#039;à obtenir le nombre
     des sous-masques capturants.
    </p>
   </li>
  </ol>
  <p class="para">
   Par exemple, soit la chaîne sujet &quot;<code class="literal">le roi soleil</code>&quot;
   qui est utilisée avec le masque suivant :
   <code class="literal">Le ((roi|prince) (soleil|charmant))</code>, les sous-masques
   capturés sont &quot;<code class="literal">roi soleil</code>&quot;, &quot;<code class="literal">roi</code>&quot;,
   et &quot;<code class="literal">soleil</code>&quot;, numérotés respectivement 1, 2, et 3.
  </p>
  <p class="para">
   L&#039;ubiquité des parenthèses n&#039;est pas toujours simple
   d&#039;emploi. Il y a des moments où regrouper des sous-masques
   est nécessaire, sans pour autant capturer la valeur trouvée.
   Si une parenthèse ouvrante est suivie de &quot;<code class="literal">?:</code>&quot;,
   le sous-masque ne capture pas la chaîne assortie, et ne sera pas
   compté lors de la numérotation des captures. Par exemple,
   avec la chaîne &quot;<code class="literal">le prince charmant</code>&quot;, utilisé
   avec le masque
   
   <code class="literal">Le (( ?:roi|prince) (soleil|charmant))</code>
   
   les chaînes capturées seront &quot;<code class="literal">prince charmant</code>&quot;
   et &quot;<code class="literal">charmant</code>&quot;, numérotés respectivement 1
   et 2. Le nombre maximal de chaînes capturées est de 65535. Il se peut qu&#039;il
   soit impossible de compiler un masque aussi large, toutefois, ceci dépend des
   options de configuration de libpcre.
  </p>
  <p class="para">
   En guise de raccourci, si n&#039;importe quelle option de configuration
   est requise au début des sous-masques non-capturants, les lettres
   d&#039;option peuvent apparaître entre le signe <code class="literal">&quot;?&quot;</code>
   et le signe <code class="literal">&quot;:&quot;</code>. Ainsi, les 2 masques
  </p>
  
  <div class="informalexample">
   <div class="example-contents">
<div class="annotation-interactive cdata"><pre>
(?i:samedi|dimanche)
(?:(?i)samedi|dimanche)
</pre></div>
   </div>

  </div>
  
  <p class="para">
   captureront exactement les mêmes chaînes. Du fait que les branches
   alternatives sont testées de la gauche vers la droite, et que les
   options ne sont pas réinitialisées tant que le sous masque n&#039;est pas
   atteint, une option de configuration d&#039;une branche n&#039;affecte pas
   les branches sous-jacentes ; ainsi, les 2 masques ci-dessus
   captureront <code class="literal">&quot;SAMEDI&quot;</code>, mais aussi 
   <code class="literal">&quot;Samedi&quot;</code>.
  </p>
  <p class="para">
   Il est possible de nommer un sous-masque en utilisant la syntaxe
   <code class="literal">(?P&lt;name&gt;pattern)</code>. Ce sous-masque sera alors
   indexé dans le tableau de concordance par sa position, ainsi 
   que par son nom. Il y a deux syntaxes alternatives :
   <code class="literal">(?&lt;name&gt;pattern)</code> et
   <code class="literal">(?&#039;name&#039;pattern)</code>.
  </p>
  
  <p class="para">
   Quelques fois, il est nécessaire d&#039;avoir plusieurs correspondances en alternant
   les sous groupes dans une expression régulière. Normalement, chacun recevra son
   propre nombre de références arrière même si seulement un d&#039;entre eux ne peut
   correspondre. Pour éviter cela, la syntaxe <code class="literal">(?|</code> permet d&#039;autoriser
   les nombres dupliqués. Soit l&#039;expression ci-après utilisée avec la chaîne
   <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">
   Ici, <code class="literal">Sun</code> est stocké dans la référence arrière 2, alors que la référence
   arrière 1 est vide. La recherche de correspondance de <code class="literal">Saturday</code> mène donc à
   <code class="literal">Sat</code> dans la référence arrière 1 alors que la référence arrière 2
   n&#039;existe pas. Changer le masque en utilisant <code class="literal">(?|</code> résout ce problème:
  </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">
   Avec ce masque, à la fois <code class="literal">Sun</code> et <code class="literal">Sat</code>
   seront stockés dans la référence arrière 1.
  </p>
 </div><?php manual_footer($setup); ?>