<?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.repetition.php',
    1 => 'Ripetizioni',
    2 => 'Ripetizioni',
  ),
  'up' => 
  array (
    0 => 'reference.pcre.pattern.syntax.php',
    1 => 'Sintassi delle regex PCRE',
  ),
  'prev' => 
  array (
    0 => 'regexp.reference.subpatterns.php',
    1 => 'Sotto-regole',
  ),
  'next' => 
  array (
    0 => 'regexp.reference.back-references.php',
    1 => 'Riferimenti all\'indietro',
  ),
  '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.repetition" class="section">
  <h2 class="title">Ripetizioni</h2>
  <p class="para">
   Le ripetizioni sono il numero delle occorrenze che possono
   essere indicate dopo i seguenti elementi:

   <ul class="itemizedlist">
    <li class="listitem"><span class="simpara">un singolo carattere, possibilmente preceduto dal carattere di escape (\)</span></li>
    <li class="listitem"><span class="simpara">il metacarattere .</span></li>
    <li class="listitem"><span class="simpara">una classe di caratteri</span></li>
    <li class="listitem"><span class="simpara">un riferimento all&#039;indietro (vedere la sezione successiva)</span></li>
    <li class="listitem"><span class="simpara">una sotto-regola (a meno che non si tratti di una asserzione -
     vedere più avanti)</span></li>
   </ul>
  </p>
  <p class="para">
   In generale una occorrenza specifica un numero minimo e massimo
   di riconoscimenti previsti tramite la specifica dei due limiti,
   posti tra parentesi graffe e separati da una virgola. Entrambi i numeri
   devono essere minori di 65536 ed il primo deve essere minore o
   uguale rispetto al secondo. Ad esempio:
   
   <code class="literal">z{2,4}</code>
   
   identifica  &quot;zz&quot;, &quot;zzz&quot; oppure &quot;zzzz&quot;. La parentesi graffa chiusa
   di suo non rappresenta un carattere speciale. Se si omette il
   secondo numero, ma si lascia la virgola, non si indica un
   limite superiore; se sia la virgola sia il secondo numero sono
   omessi, l&#039;occorrenza specifica l&#039;esatto numero di riconoscimenti richiesti. Il criterio
   
   <code class="literal">[aeiou]{3,}</code>
   
   identifica almeno 3 o più vocali consecutive, 
   mentre
   
   <code class="literal">\d{8}</code>
   
   identifica esattamente 8 cifre. Una parentesi graffa aperta
   che compaia in una posizione in cui non sia prevista una
   occorrenza, o che comunque non sia riconducibile alla sintassi
   di una occorrenza, viene tratta come il carattere &quot;{&quot;. Ad
   esempio {,6} non indica delle occorrenze, ma una stringa di 4 caratteri.
  </p>
  <p class="para">
   L&#039;indicazione {0} è permessa. Indica di comportarsi come se
   l&#039;elemento precedente all&#039;occorrenza non fosse 
   presente.
  </p>
  <p class="para">
   Per praticità (e compatibilità verso il passato) si usano 3
   abbreviazioni per le occorrenze più comuni:
   
   <table class="doctable table">
    <caption><strong>Indicatore di occorrenza</strong></caption>
    
     <tbody class="tbody">
      <tr>
       <td><code class="literal">*</code></td>
       <td>equivale a <code class="literal">{0,}</code></td>
      </tr>

      <tr>
       <td><code class="literal">+</code></td>
       <td>equivale a <code class="literal">{1,}</code></td>
      </tr>

      <tr>
       <td><code class="literal">?</code></td>
       <td>equivale a <code class="literal">{0,1}</code></td>
      </tr>

     </tbody>
    
   </table>

  </p>
  <p class="para">
   E&#039; anche possibile creare un ciclo infinito facendo seguire
   ad una sotto-regola che non identifica alcun carattere una
   occorrenza priva di limite superiore. Ad esempio:
   
   <code class="literal">(a?)*</code>
  </p>
  <p class="para">
   Le versioni precedenti di Perl e di PCRE segnalavano un errore
   durante la fase di compila per questi criteri. Tuttavia, poiché
   vi sono casi dove questi criteri possono essere utili, queste
   regole sono accettate, ma, se la ripetizione non riconosce
   alcun carattere, il ciclo viene interrotto.
  </p>
  <p class="para">
   Per default le occorrenze sono &quot;bramose&quot;, infatti identificano
   più testi possibile (fino al numero massimo permesso), senza
   per questo fare fallire il riconoscimento della parte rimanente
   del criterio di ricerca. Il classico esempio dove questo comportamento
   può essere un problema, riguarda il riconoscimento dei commenti
   nei programmi C. Questi compaiono tra le sequenze /* ed */,
   ma all&#039;interno, nel commento, si possono usare sia il carattere
   *, sia il carattere /. Il tentativo di individuare i commenti C con il seguente criterio
   
   <code class="literal">/\*.*\*/</code>
   
   se applicato al commento
   
   <code class="literal">/* primo commento */  nessun commento  /* secondo commento */</code>
   
   non ha successo, perché identifica l&#039;intera stringa a causa
   della &quot;bramosia&quot; dell&#039;elemento &quot;.*&quot;.
  </p>
  <p class="para">
   Tuttavia, se un&#039;occorrenza è seguita da un punto interrogativo,
   questa cessa di essere &quot;bramosa&quot;, e identifica il numero
   minimo di testi permessi. Pertanto il criterio
   
   <code class="literal">/\*.*?\*/</code>
   
   si comporta correttamente con i commenti C. Il significato
   delle varie occorrenze non è stato cambiato, si è soltanto
   modificato il numero delle occorrenze da riconoscere. Attenzione
   a non confondere questo uso del punto interrogativo con il
   suo proprio significato. Dati i due utilizzi del ?, può
   anche capitare di averli entrambi come in
   
   <code class="literal">\d??\d</code>
   
   che, preferibilmente, identifica una cifra, ma può riconoscerne
   due se questa è l&#039;unica via per soddisfare il riconoscimento dell&#039;intero criterio.
  </p>
  <p class="para">
   Se si attiva l&#039;opzione <a href="reference.pcre.pattern.modifiers.php" class="link">PCRE_UNGREEDY</a>
   (un&#039;opzione che non è disponibile in Perl), per default le occorrenze
   non sono &quot;bramose&quot;, ma ogni singola occorrenza può essere
   resa &quot;bramosa&quot; se seguita dal punto interrogativo. In altre
   parole si è invertito il normale 
   comportamento.
  </p>
  <p class="para">
   Le occorrenze seguite da <code class="literal">+</code> sono &quot;possessive&quot;. 
   Identificano il maggior numero possibile di caratteri e non riconoscono il
   resto del criterio. Quindi <code class="literal">.*abc</code> riconosce &quot;aabc&quot; al contrario di
   <code class="literal">.*+abc</code> perché <code class="literal">.*+</code> identifica
   tutta la stringa. Le occorrenze possessive possono essere utilizzate per velocizzare l&#039;analisi.
  </p>
  <p class="para">
   Quando si indica un numero minimo di occorrenze maggiore di 1,
   per una sotto-regola posta tra parentesi, oppure
   si indica un numero massimo di occorrenze, la fase di
   compila richiede più spazio in proporzione ai valori minimo e massimo.
  </p>
  <p class="para">
   Se un criterio inizia con .* oppure .{0,} e si è attivata
   l&#039;opzione <a href="reference.pcre.pattern.modifiers.php" class="link">PCRE_DOTALL</a>
   (euivalente al /s di Perl), permettendo al . di identificare
   il carattere di &quot;a capo&quot;, si dice che il criterio è implicitamente
   ancorato, perché qualsiasi elemento che segue sarà confrontato
   con ciascun carattere della stringa oggetto della ricerca,
   e pertanto non vi è nessuna posizione, a parte la prima, da
   cui ripartire per ritentare il riconoscimento dell&#039;intero criterio.
   PCRE tratta tale criterio come se fosse preceduto dalla sequenza
   \A. Nei casi in cui è noto a priori che la stringa oggetto di
   ricerca non contiene caratteri di &quot;a capo&quot;, vale la pena di
   attivare l&#039;opzione <a href="reference.pcre.pattern.modifiers.php" class="link">PCRE_DOTALL</a>
   se il criterio di ricerca inizia con &quot;.*&quot;, per ottenere
   questa ottimizzazione, oppure, in alternativa, usare &quot;^&quot; per indicare in modo esplicito un ancoraggio.
  </p>
  <p class="para">
   Quando si ripete una sotto-regola di cattura, il testo
   estrapolato è la parte identificata dall&#039;iterazione finale.  Ad esempio se il criterio
   
   <code class="literal">(tweedle[dume]{3}\s*)+</code>
   
   viene applicato al testo &quot;tweedledum tweedledee&quot;, il testo
   estrapolato sarà &quot;tweedledee&quot;. Tuttavia se vi sono delle
   sotto-regole annidate, il testo catturato può essere
   determinato dalle iterazioni precedenti. Ad esempio nel
   criterio
   
   <code class="literal">/(a|(b))+/</code>
   
   applicato a &quot;aba&quot;, la seconda stringa catturata è 
   &quot;b&quot;.
  </p>
 </div><?php manual_footer($setup); ?>