<?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.conditional.php',
    1 => 'Les sous-masques conditionnels',
    2 => 'Les sous-masques conditionnels',
  ),
  'up' => 
  array (
    0 => 'reference.pcre.pattern.syntax.php',
    1 => 'Fonctionnement des expressions r&eacute;guli&egrave;res',
  ),
  'prev' => 
  array (
    0 => 'regexp.reference.onlyonce.php',
    1 => 'Sous-masques uniques',
  ),
  'next' => 
  array (
    0 => 'regexp.reference.comments.php',
    1 => 'Commentaires',
  ),
  '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.conditional" class="section">
  <h2 class="title">Les sous-masques conditionnels</h2>
  <p class="para">
   Il est possible de lier un sous-masque à une condition, ou de
   choisir entre deux sous-masques alternatifs, en fonction du
   résultat d&#039;une assertion, ou suivant les résultats
   de recherche précédents.
   Les deux formes possibles de sous-masques conditionnels sont
  </p>
  
 <div class="informalexample">
   <div class="example-contents">
<div class="annotation-interactive cdata"><pre>
(?(condition)masque positif)
(?(condition) masque positif | masque négatif)
</pre></div>
  </div>

  </div>
  <p class="para">
   Si les conditions sont satisfaites, le masque positif est utilisé,
   sinon, le masque négatif est utilisé, si présent.
   S&#039;il y a plus de deux possibilités, une erreur est générée
   à la compilation.
  </p>
  <p class="para">
   Il y a deux types de conditions : si le texte entre les parenthèses
   est une séquence de chiffres, alors la condition est satisfaite si
   le sous-masque correspondant à ce numéro a réussi.
   Considérons le masque suivant, qui contient des espaces non
   significatifs pour le rendre plus compréhensible (on supposera
   l&#039;option <a href="reference.pcre.pattern.modifiers.php" class="link">PCRE_EXTENDED</a>
   activée) et qui est divisé en trois parties
   pour simplifier les explications :
  </p>
  <div class="informalexample">
   <div class="example-contents">
<div class="annotation-interactive cdata"><pre>
( \( )?    [^()]+    (?(1) \) )
</pre></div>
   </div>

  </div>
  <p class="para">
   La première partie recherche une parenthèse ouvrante
   optionnelle et, si elle existe, elle est capturée. La deuxième
   partie recherche une séquence de caractères qui ne contiennent
   pas de parenthèses. La troisième partie est
   conditionnée à la première, et s&#039;assure que s&#039;il
   y a une parenthèse ouvrante, il en existe une fermante.
   Si une parenthèse ouvrante a été trouvée,
   elle a été capturée, et donc la première capture
   existe, et la condition est exécutée. Sinon, elle est
   ignorée. Ce masque recherche donc une séquence de lettres,
   éventuellement placées entre parenthèses.
  </p>
  <p class="para">
   Si la condition est la chaîne <code class="literal">(R)</code>, elle sera
   satisfaite si un appel récursif au masque ou au sous-masque
   a été fait. Au premier appel, la condition n&#039;est pas vérifiée.
  </p>
  <p class="para">
   Si la condition n&#039;est pas une séquence de chiffres, il faut que ce soit
   une assertion. Ce peut être une assertion positive ou négative,
   arrière ou avant. Considérons le masque suivant (mêmes conditions que
   le précédent) et avec deux possibilités en seconde ligne :
  </p>
  
  <div class="informalexample">
   <div class="example-contents">
<div class="annotation-interactive cdata"><pre>
(?(?=[^a-z]*[a-z])
\d{2}-[a-z]{3}-\d{2}  |  \d{2}-\d{2}-\d{2} )
</pre></div>
   </div>

  </div>
  <p class="para">
   La condition est une assertion avant positive, qui recherche une
   séquence optionnelle de caractères non-lettre. En d&#039;autres
   termes, elle teste la présence d&#039;au moins une lettre dans la chaîne
   sujet. Si une lettre est trouvée, la recherche se poursuit avec
   la première alternative, et sinon, avec la seconde. Ce masque
   recherche des chaînes de la forme <code class="literal">dd-aaa-dd</code> ou
   <code class="literal">dd-dd-dd</code>, avec &quot;<code class="literal">aaa</code>&quot; qui sont des
   lettres, et <code class="literal">dd</code> qui sont des chiffres.
  </p>
 </div><?php manual_footer($setup); ?>