<?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 => 'it',
  ),
  'this' => 
  array (
    0 => 'regexp.reference.subpatterns.php',
    1 => 'Sotto-regole',
    2 => 'Sotto-regole',
  ),
  'up' => 
  array (
    0 => 'reference.pcre.pattern.syntax.php',
    1 => 'Sintassi delle regex PCRE',
  ),
  'prev' => 
  array (
    0 => 'regexp.reference.internal-options.php',
    1 => 'Settaggio delle opzioni interne',
  ),
  'next' => 
  array (
    0 => 'regexp.reference.repetition.php',
    1 => 'Ripetizioni',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'it',
    '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">Sotto-regole</h2>
  <p class="para">
   Le sotto-regole sono delimitate dalle parentesi tonde e
   possono essere annidate. La definizione di una parte di
   una regola di riconoscimento come sotto-regola può servire a:
  </p>
  <ol type="1">
   <li class="listitem">
    <p class="para">
     Localizzare un set di alternative. Ad esempio il criterio
     <code class="literal">cat(aract|erpillar|)</code> riconosce una tra le parole &quot;cat&quot;,
     &quot;cataract&quot; oppure &quot;caterpillar&quot;. Se non fossero state usate le parentesi, il criterio
     avrebbe riconosciuto &quot;cataract&quot;, &quot;erpillar&quot; oppure una stringa vuota.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Identificare e catturare parte del testo riconosciuto dalla sotto-regola (come illustrato in seguito). 
     Quando il riconoscimento dell&#039;intero criterio ha avuto successo, le porzioni della stringa oggetto
     della ricerca identificate dalle sotto-regole sono restituite alla funzione chiamante tramite
     l&#039;argomento <em>vettore</em> della funzione <span class="function"><strong>pcre_exec()</strong></span>.
     Per determinare il numero ordinale di ciascuna sotto-regola si contano le parentesi aperte da
     sinistra verso destra partendo da 1.
    </p>
   </li>
  </ol>
  <p class="para">
   Ad esempio, se si esegue un riconoscimento nella frase
   &quot;the red king&quot; con il seguente criterio
   
   <code class="literal">the ((red|white) (king|queen))</code>
   
   si ottengono i testi &quot;red king&quot;, &quot;red&quot; e &quot;king&quot;, rispettivamente
   identificati dalla sotto-regola 1, 2 e 3.
  </p>
  <p class="para">
   Il fatto che le parentesi tonde adempiano a due funzioni non
   sempre porta a situazioni comprensibili. Spesso capita di
   dovere raggruppare delle sotto-regole senza per questo essere
   richiesta la cattura del testo. A tale scopo l&#039;uso della
   sequenza &quot;?:&quot; dopo la parentesi di apertura permette di indicare
   che questa sotto-regola non deve catturare il testo, e non deve essere
   conteggiata nel numero d&#039;ordine delle sotto-regole di cattura.
   Ad esempio, applicando il criterio
   
   <code class="literal">the ((?:red|white) (king|queen))</code>
   
   alla frase &quot;the  white  queen&quot;, si catturano i testi &quot;white queen&quot;
   e  &quot;queen&quot;,  rispettivamente numerati 1 e 2. Il numero massimo
   di testi catturabili è 99, il numero massimo di sotto-regole,
   a prescindere che siano di cattura o meno, è 200.
  </p>
  <p class="para">
   Come utile abbreviazione, nei casi in cui l&#039;attivazione di
   alcune opzioni debba essere fatta all&#039;inizio di una sotto-regola
   non di cattura, la lettera dell&#039;opzione può comparire tra la
   &quot;?&quot; e &quot;:&quot;. Pertanto i due criteri
  </p>
  
  <div class="informalexample">
   <div class="example-contents">
<div class="cdata"><pre>
(?i:saturday|sunday)
(?:(?i)saturday|sunday)
</pre></div>
   </div>

  </div>
  
  <p class="para">
   riconoscono esattamente lo stesso set di parole. Poiché i rami alternativi
   sono provati da sinistra verso destra, e le opzioni non sono
   azzerate fino a quando non si è conclusa la sotto-regola, una opzione
   attivata in un ramo alternativo si applica a tutte le alternative che seguono. Pertanto,
   nell&#039;esempio di prima, sia la parola &quot;SUNDAY&quot; che la parola &quot;Saturday&quot; sono testi identificati correttamente.
  </p>
  
  <p class="para">
   È possibile dare un nome ad una sottoregola usando la sintassi
   <code class="literal">(?P&lt;name&gt;pattern)</code>. Questa sottoregola sarà quindi
   indicizzata nella matrice dei riconoscimenti attraverso la sua posizione numerica e
   anche attraverso il nome. PHP 5.2.2 ha introdotto due sintassi alternative
   <code class="literal">(?&lt;name&gt;pattern)</code> e <code class="literal">(?&#039;name&#039;pattern)</code>.
  </p>

  <p class="para">
   Qualche volta è necessario avere riconoscimenti multipli, ma con sottogruppi
   alternativi nell&#039;espressione regolare. Normalmente, ad ognuno di questi verrebbe dato
   un numero di riferimento anche se solo uno di essi verrà in effetti
   riconosciuto. Per ovviare a questa situazione, la sintassi <code class="literal">(?|</code> permette
   di avere numeri duplicati. Si consideri la seguente espressione eseguita rispetto alla
   stringa <code class="literal">Sunday</code>:
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="cdata"><pre>(?:(Sat)ur|(Sun))day</pre></div>
   </div>

  </div>

  <p class="para">
   In questo caso <code class="literal">Sun</code> è salvato nel riferimento 2, mentre
   il riferimento 1 è vuoto. La ricerca metterà <code class="literal">Sat</code> nel
   riferimento 1 mentre il riferimento 2 non esiste. La soluzione è cambiare
   la regola usando <code class="literal">(?|</code>:
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="cdata"><pre>(?|(Sat)ur|(Sun))day</pre></div>
   </div>

  </div>

  <p class="para">
   Utilizzando questa regola, sia <code class="literal">Sun</code> che <code class="literal">Sat</code>
   sono inseriti nel riferimento 1.
  </p>
 </div><?php manual_footer($setup); ?>