-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy pathpattern.syntax.xml
More file actions
2142 lines (2016 loc) · 89.6 KB
/
pattern.syntax.xml
File metadata and controls
2142 lines (2016 loc) · 89.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: e43a330c074700dff5c3a9080b01e1f0a97ac081 Maintainer: darvina Status: working -->
<!-- splitted from ./it/functions/pcre.xml, last change in rev 1.1 -->
<chapter xml:id="reference.pcre.pattern.syntax" xmlns="http://docbook.org/ns/docbook">
<title>Sintassi dei pattern</title>
<titleabbrev>Sintassi delle regex PCRE</titleabbrev>
<section xml:id="regexp.introduction">
<title>Introduzione</title>
<para>
Di seguito verrà descritta la sintassi e la semantica delle espressioni
regolari così come sono supportate da PCRE. La descrizione delle espressioni regolari
può essere reperita anche nei manuali di Perl e in numerosi
altri libri, alcuni dei quali ricchi di esempi. Ad esempio il libro di Jeffrey
Friedl intitolato "Mastering Regular Expressions", edito
da O'Reilly (ISBN 1-56592-257-3), li tratta in modo dettagliato.
Questa descrizione, invece, viene intesa come una documentazione di riferimento.
</para>
<para>
Una espressione regolare è un criterio utilizzato per
identificare parti di un testo partendo da sinistra verso
destra. La maggior parte delle lettere identifica se
stessa nel testo oggetto del riconoscimento. Ad esempio
il banale testo <literal>La volpe veloce</literal>
intercetta la parte del testo uguale all'espressione
regolare.
</para>
</section>
<section xml:id="regexp.reference.delimiters">
<title>Delimitatori</title>
<para>
Quando si usano le funzioni PCRE, il pattern deve essere racchiuso
da <emphasis>delimitatori</emphasis>. Un delimitatore può essere qualsiasi carattere
non alfanumerico, esclusi il backslash e i caratteri di spazio (spazio, tab, ecc.).
</para>
<para>
Delimitatori usati spesso sono la barra "slash" (<literal>/</literal>), il cancelletto "hash"
(<literal>#</literal>) e la tilde (<literal>~</literal>). I
seguenti sono esempi di delimitazioni valide dei pattern:
<informalexample>
<programlisting>
<![CDATA[
/foo bar/
#^[^0-9]$#
+php+
%[a-zA-Z0-9_-]%
]]>
</programlisting>
</informalexample>
</para>
<para>
If the delimiter needs to be matched inside the pattern it must be
escaped using a backslash. If the delimiter appears often inside the
pattern, it is a good idea to choose another delimiter in order to increase
readability.
<informalexample>
<programlisting>
<![CDATA[
/http:\/\//
#http://#
]]>
</programlisting>
</informalexample>
The <function>preg_quote</function> function may be used to escape a string
for injection into a pattern and its optional second parameter may be used
to specify the delimiter to be escaped.
</para>
<para>
In addition to the aforementioned delimiters, it is also possible to use
bracket style delimiters where the opening and closing brackets are the
starting and ending delimiter, respectively.
<informalexample>
<programlisting>
<![CDATA[
{this is a pattern}
]]>
</programlisting>
</informalexample>
</para>
<para>
You may add <link linkend="reference.pcre.pattern.modifiers">pattern
modifiers</link> after the ending delimiter. The following is an example
of case-insensitive matching:
<informalexample>
<programlisting>
<![CDATA[
#[a-z]#i
]]>
</programlisting>
</informalexample>
</para>
</section>
<section xml:id="regexp.reference.meta">
<title>Meta-caratteri</title>
<para>
La potenza delle espressioni regolari deriva dalla
possibilità di inserire criteri alternativi oppure
ripetuti. Questi sono codificati nel criterio di
ricerca tramite l'uso di <emphasis>meta-caratteri</emphasis>,
lettere che non indicano se stesse, ma sono interpretate in modo particolare.
</para>
<para>
Esistono due differenti set di meta-caratteri: quelli che
sono riconosciuti ovunque tranne che all'interno di parentesi
quadrate, e quelli che sono riconosciuti all'interno di parentesi quadrate.
I meta-caratteri che si usano all'esterno delle parentesi quadrate sono:
<variablelist>
<varlistentry>
<term><emphasis>\</emphasis></term>
<listitem><simpara>carattere di escape generico con diversi utilizzi</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>^</emphasis></term>
<listitem><simpara>indica l'inizio del testo (o della linea in modalità multi-linea)</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>$</emphasis></term>
<listitem><simpara>indica la fine del testo (o della linea in modalità multi-linea)</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>.</emphasis></term>
<listitem><simpara>indica qualsiasi carattere tranne "a capo" (per default)</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>[</emphasis></term>
<listitem><simpara>carattere di inizio della definizione di classe</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>]</emphasis></term>
<listitem><simpara>carattere di fine della definizione di classe</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>|</emphasis></term>
<listitem><simpara>inizio di un ramo alternativo</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>(</emphasis></term>
<listitem><simpara>inizio di un criterio di riconoscimento parziale</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>)</emphasis></term>
<listitem><simpara>fine del criterio di riconoscimento parziale</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>?</emphasis></term>
<listitem>
<simpara>
estende il significato di (, oppure 0 o 1 occorrenza, oppure occorrenza minima
(vedere <link linkend="regexp.reference.repetition">ripetizione</link>)
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>*</emphasis></term>
<listitem><simpara>0 o più occorrenze</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>+</emphasis></term>
<listitem><simpara>1 o più occorrenze</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>{</emphasis></term>
<listitem><simpara>inizia l'intervallo minimo/massimo di occorrenze</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>}</emphasis></term>
<listitem><simpara>termina l'intervallo minimo/massimo di occorrenze</simpara></listitem>
</varlistentry>
</variablelist>
La parte del criterio che si trova tra parentesi quadrate
viene detta "classe di caratteri". In una classe di caratteri
i meta-caratteri previsti sono:
<variablelist>
<varlistentry>
<term><emphasis>\</emphasis></term>
<listitem><simpara>carattere di escape generico con diversi utilizzi</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>^</emphasis></term>
<listitem><simpara>nega la classe, ma solo se posto all'inizio</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>-</emphasis></term>
<listitem><simpara>indica un intervallo</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>]</emphasis></term>
<listitem><simpara>chiude la classe di caratteri</simpara></listitem>
</varlistentry>
</variablelist>
Le sezioni seguenti descriveranno l'uso di ciascuno dei
meta-caratteri.
</para>
</section>
<section xml:id="regexp.reference.escape">
<title>Sequenze di escape</title>
<para>
Il carattere backslash (\) ha diversi utilizzi. Primo uso: se
viene anteposto a caratteri non alfanumerici, rimuove gli
eventuali significati speciali che il carattere può avere. Questo utilizzo
di backslash come carattere di escape può essere svolto sia all'interno delle
classi di caratteri, sia all'esterno.
</para>
<para>
Ad esempio, un criterio che deve riconoscere il carattere "*"
conterrà "\*". Ciò si applica indipendentemente dal
carattere seguente, sia esso interpretabile come meta-carattere
o meno. Nel caso in cui un carattere non alfanumerico debba
identificare se stesso è opportuno farlo precedere dal "\".
In particolare per identificare un backslash occorre scrivere "\\".
</para>
<note>
<para>
Le <link linkend="language.types.string.syntax">stringhe</link> PHP
a singolo o doppio apice hanno un significato
speciale del backslash. Quindi, se \ deve essere cercato con un'espressione
regolare \\, nel codice PHP deve essere usato "\\\\" oppure '\\\\'.
</para>
</note>
<para>
Se nel criterio di riconoscimento si specifica l'opzione
<link linkend="reference.pcre.pattern.modifiers">PCRE_EXTENDED</link>,
lo spazio bianco (diversamente da quando si trova all'interno di una classe
di caratteri), e i caratteri posti tra "#" e un "a capo" all'esterno di una
classe di caratteri sono ignorati. Un backslash può essere usato come escape per inserire uno
spazio bianco od il carattere "#" come parte del criterio di riconoscimento.
</para>
<para>
Un secondo utilizzo del backslash consiste nel codificare in
modo visibile dei caratteri non visibili. Non ci sono restrizioni
nella presenza di caratteri non-stampabili, a parte lo zero
binario terminante la stringa dell'espressione regolare.
Di seguito saranno elencate le sequenze di caratteri che
è preferibile utilizzare per la loro semplicità al posto
delle corrispondenti codifiche binarie.
</para>
<para>
<variablelist>
<varlistentry>
<term><emphasis>\a</emphasis></term>
<listitem>
<simpara>allarme, il carattere BEL (hex 07)</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\cx</emphasis></term>
<listitem>
<simpara>"control-x", dove x è un qualsiasi carattere</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\e</emphasis></term>
<listitem>
<simpara>escape (hex 1B)</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\f</emphasis></term>
<listitem>
<simpara>salto pagina (hex 0C)</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\n</emphasis></term>
<listitem>
<simpara>"a capo" (newline) (hex 0A)</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\p{xx}</emphasis></term>
<listitem>
<simpara>
un carattere con la proprietà xx, vedere
<link linkend="regexp.reference.unicode">proprietà unicode</link>
per maggiori informazioni
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\P{xx}</emphasis></term>
<listitem>
<simpara>
un carattere senza la proprietà xx, vedere
<link linkend="regexp.reference.unicode">proprietà unicode</link>
per maggiori informazioni
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\r</emphasis></term>
<listitem>
<simpara>carriage return (hex 0D)</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\t</emphasis></term>
<listitem>
<simpara>tabulazione (hex 09)</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\xhh</emphasis></term>
<listitem>
<simpara>
carattere il cui codice esadecimale è hh
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\ddd</emphasis></term>
<listitem>
<simpara>carattere il cui codice ottale è ddd, oppure riferimento all'indietro</simpara>
</listitem>
</varlistentry>
</variablelist>
</para>
<para>
Il preciso effetto di "<literal>\cx</literal>" è il seguente:
se "<literal>x</literal>" è una lettera minuscola, viene convertita
in lettera maiuscola. In pratica viene invertito il sesto bit (hex 40)
del carattere. Quindi "<literal>\cz</literal>" diventa hex 1A, ma
"<literal>\c{</literal>" diventa hex 3B, mentre "<literal>\c;</literal>"
diventa hex 7B.
</para>
<para>
Dopo la sequenza "<literal>\x</literal>", saranno letti due
numeri esadecimali (per le lettere non si distingue tra maiuscolo e minuscolo).
In <emphasis>modalità UTF-8</emphasis>, "<literal>\x{...}</literal>" è
permesso, quando il contenuto delle parentesi graffe è una stringa di
cifre esadecimali. È interpretato come un carattere UTF-8 il cui numero di codice è
la cifra esadecimale specificata. La sequenza originale esadecimale di escape,
<literal>\xhh</literal>, cerca un carattere UTF-8 a due byte se il valore
è maggiore di 127.
</para>
<para>
Dopo la sequenza "<literal>\0</literal>" saranno lette due cifre in ottale.
In entrambi i casi se vi sono meno di due cifre, saranno usati i
numeri presenti. Pertanto la sequenza "<literal>\0\x\07</literal>"
indica 2 zeri binari seguiti dal carattere BEL. Occorre accertarsi
di passare le cifre necessarie dopo lo zero iniziale se il carattere
che segue può essere scambiato per una cifra in ottale.
</para>
<para>
Più complicata è la gestione del backslash seguito da una cifra
diversa da 0. Al di fuori di una classe di caratteri, PCRE
tratta le cifre che trova come numeri decimali. Se il numero
è inferiore a 10, oppure vi sono state almeno altrettante
parentesi sinistre, la sequenza viene considerata come un
<emphasis>riferimento</emphasis> <emphasis>all'indietro</emphasis>.
Più avanti, nella parte dei criteri parziali, sarà descritto come
funzionano questi riferimenti.
</para>
<para>
All'interno di una classe di caratteri, oppure nel caso in cui il numero decimale
è maggiore di 9 e non ci sono stati altrettanti criteri parziali,
PCRE rilegge le prime 3 cifre seguenti il backslash in ottale
e genera il carattere dagli 8 bit meno significativi del valore
ottenuto. Ogni altra cifra seguente indica se stessa.
Ad esempio:
</para>
<para>
<variablelist>
<varlistentry>
<term><emphasis>\040</emphasis></term>
<listitem><simpara>è un'altro modo per indicare uno spazio</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\40</emphasis></term>
<listitem>
<simpara>
ha il medesimo significato dell'esempio precedente che
non vi sono 40 sotto-criteri
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\7</emphasis></term>
<listitem><simpara>è sempre un riferimento all'indietro</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\11</emphasis></term>
<listitem>
<simpara>
può essere un riferimento all'indietro o un'altro modo
per indicare il carattere di tabulazione
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\011</emphasis></term>
<listitem><simpara>è ancora il carattere di tabulazione</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\0113</emphasis></term>
<listitem><simpara>il carattere di tabulazione seguito da "3"</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\113</emphasis></term>
<listitem>
<simpara>
è il carattere con il codice ottale 113 (poiché non
ci possono essere più di 99 riferimenti all'indietro)
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\377</emphasis></term>
<listitem><simpara>è un byte con tutti i bit a 1</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\81</emphasis></term>
<listitem>
<simpara>
può essere un riferimento all'indietro o
uno zero binario seguito da "8" e da "1"
</simpara>
</listitem>
</varlistentry>
</variablelist>
</para>
<para>
Occorre rilevare che valori ottali maggiori di 100 non devono
essere preceduti dallo zero, questo perché la libreria considera
solo tre cifre.
</para>
<para>
Tutte le sequenze che definiscono il valore di un singolo byte possono essere
utilizzate sia all'interno sia all'esterno delle classe di caratteri. Inoltre,
all'interno delle classi di caratteri, la sequenza "<literal>\b</literal>"
viene interpretata come carattere di backspace (hex 08), mentre all'esterno ha
un altro significato (come descritto più avanti).
</para>
<para>
Il terzo utilizzo possibile per il backslash consiste nello
specificare il tipo di carattere:
</para>
<para>
<variablelist>
<varlistentry>
<term><emphasis>\d</emphasis></term>
<listitem><simpara>qualsiasi cifra decimale</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\D</emphasis></term>
<listitem><simpara>qualsiasi carattere che non sia una cifra decimale</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\h</emphasis></term>
<listitem><simpara>qualsiasi carattere identificato come spazio bianco orizzontale (da PHP 5.2.4)</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\H</emphasis></term>
<listitem><simpara>qualsiasi carattere che non sia identificato come spazio bianco orizzontale (da PHP 5.2.4)</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\s</emphasis></term>
<listitem><simpara>qualsiasi carattere identificato come spazio bianco</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\S</emphasis></term>
<listitem><simpara>qualsiasi carattere che non sia identificato come spazio bianco</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\v</emphasis></term>
<listitem><simpara>qualsiasi carattere identificato come spazio bianco verticale (da PHP 5.2.4)</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\V</emphasis></term>
<listitem><simpara>qualsiasi carattere che non sia identificato come spazio bianco verticale (da PHP 5.2.4)</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\w</emphasis></term>
<listitem><simpara>qualsiasi carattere che sia una "parola" (word)</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\W</emphasis></term>
<listitem><simpara>qualsiasi carattere che non sia una "parola" (word)</simpara></listitem>
</varlistentry>
</variablelist>
</para>
<para>
Ciascuna coppia di sequenze di escape suddivide il set
completo dei caratteri in due insiemi disgiunti. Un dato carattere
deve essere identificato da un solo insieme di ciascuna coppia.
</para>
<para>
I caratteri definiti "parole" sono quelle lettere o cifre o il carattere
underscore (_), cioè qualsiasi carattere che possa essere parte di una
"<literal>parola</literal>" in Perl. In PCRE le definizioni di lettere e cifre vengono
gestite tramite le tabelle dei caratteri, che possono variare in base a specifici parametri
di localizzazione. Ad esempio, nella localizzazione fr (relativa alla Francia), qualche
codice carattere maggiore di 128 è utilizzato per le lettere
accentate, e queste sono identificate tramite la sequenza <literal>\w</literal>.
</para>
<para>
Queste sequenze di tipi di caratteri possono apparire sia all'interno sia all'esterno delle
classi di caratteri. Ciascuna di esse identifica un carattere del tipo appropriato.
Se durante la fase di identificazione di un testo, si giunge al termine della stringa in cui
si esegue il riconoscimento e si hanno ancora di queste sequenze da incrociare, l'operazione
di identificazione fallirà perché, ovviamente, non vi sono più caratteri in cui riconoscere le suddette sequenze.
</para>
<para>
Il quarto utilizzo per il backslash riguarda la costruzione
di particolari asserzioni. L'asserzione è una condizione che deve essere soddisfatta
ad un certo punto del riconoscimento, senza "consumare" caratteri dalla stringa oggetto del
riconoscimento. Più avanti verranno descritte asserzioni più complicate, costruite tramite
l'uso di sotto-criteri di riconoscimento, per ora saranno illustrate delle semplici
asserzioni costruite con il backslash:
</para>
<para>
<variablelist>
<varlistentry>
<term><emphasis>\b</emphasis></term>
<listitem><simpara>limite di una parola</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\B</emphasis></term>
<listitem><simpara>non limite di una parola</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\A</emphasis></term>
<listitem><simpara>inizio dell'oggetto di ricerca (a prescindere dalla modalità multi-linea)</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\Z</emphasis></term>
<listitem>
<simpara>
fine dell'oggetto di ricerca oppure newline alla fine (a prescindere dalla
modalità multi-linea)
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\z</emphasis></term>
<listitem><simpara>fine dell'oggetto di ricerca (a prescindere dalla modalità multi-linea)</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\G</emphasis></term>
<listitem><simpara>prima posizione trovata nell'oggetto</simpara></listitem>
</varlistentry>
</variablelist>
</para>
<para>
Queste asserzioni non possono apparire all'interno di una
classe di caratteri (attenzione che la sequenza "<literal>\b</literal>"
all'interno di una classe di caratteri indica il carattere backspace).
</para>
<para>
Viene definito limite di una parola la posizione nella stringa oggetto della ricerca, nella quale
il carattere corrente ed il carattere precedente non soddisfano la
sequenza <literal>\w</literal> o la sequenza <literal>\W</literal> (ad esempio uno soddisfa la sequenza
<literal>\w</literal> e l'altro carattere soddisfa la sequenza
<literal>\W</literal>), oppure quella posizione, all'inizio o alla fine della stringa, nella quale rispettivamente
il primo o l'ultimo carattere soddisfa la sequenza <literal>\w</literal>.
</para>
<para>
Le asserzioni <literal>\A</literal>, <literal>\Z</literal> e <literal>\z</literal>
differiscono dai tradizionali caratteri "^" e "$" (descritti
di seguito) per il fatto di identificare sempre l'inizio o la
fine della stringa oggetto di ricerca a prescindere da quale
opzione sia stata attivata. Infatti queste asserzioni non sono
alterate da <link linkend="reference.pcre.pattern.modifiers">PCRE_MULTILINE</link>
oppure da <link linkend="reference.pcre.pattern.modifiers">PCRE_DOLLAR_ENDONLY</link>.
La differenza tra <literal>\Z</literal> e <literal>\z</literal>
consiste nel fatto che <literal>\Z</literal> identifica sia il carattere
precedente il newline posto al termine della stringa sia la fine della
stringa, mentre <literal>\z</literal> identifica solo la fine.
</para>
<para>
The <literal>\G</literal> assertion is true only when the current
matching position is at the start point of the match, as specified by
the <parameter>offset</parameter> argument of
<function>preg_match</function>. It differs from <literal>\A</literal>
when the value of <parameter>offset</parameter> is non-zero.
</para>
<para>
<literal>\Q</literal> and <literal>\E</literal> can be used to ignore
regexp metacharacters in the pattern. For example:
<literal>\w+\Q.$.\E$</literal> will match one or more word characters,
followed by literals <literal>.$.</literal> and anchored at the end of
the string.
</para>
<para>
<literal>\K</literal> can be used to reset the match start since
PHP 5.2.4. For example, the pattern <literal>foo\Kbar</literal> matches
"foobar", but reports that it has matched "bar". The use of
<literal>\K</literal> does not interfere with the setting of captured
substrings. For example, when the pattern <literal>(foo)\Kbar</literal>
matches "foobar", the first substring is still set to "foo".
</para>
</section>
<section xml:id="regexp.reference.unicode">
<title>Unicode character properties</title>
<para>
Since 5.1.0, three
additional escape sequences to match generic character types are available
when <emphasis>UTF-8 mode</emphasis> is selected. They are:
</para>
<variablelist>
<varlistentry>
<term><emphasis>\p{xx}</emphasis></term>
<listitem><simpara>a character with the xx property</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\P{xx}</emphasis></term>
<listitem><simpara>a character without the xx property</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\X</emphasis></term>
<listitem><simpara>an extended Unicode sequence</simpara></listitem>
</varlistentry>
</variablelist>
<para>
The property names represented by <literal>xx</literal> above are limited
to the Unicode general category properties. Each character has exactly one
such property, specified by a two-letter abbreviation. For compatibility with
Perl, negation can be specified by including a circumflex between the
opening brace and the property name. For example, <literal>\p{^Lu}</literal>
is the same as <literal>\P{Lu}</literal>.
</para>
<para>
If only one letter is specified with <literal>\p</literal> or
<literal>\P</literal>, it includes all the properties that start with that
letter. In this case, in the absence of negation, the curly brackets in the
escape sequence are optional; these two examples have the same effect:
</para>
<informalexample>
<programlisting>
<![CDATA[
\p{L}
\pL
]]>
</programlisting>
</informalexample>
<table>
<title>Supported property codes</title>
<tgroup cols="3">
<thead>
<row>
<entry>Property</entry>
<entry>Matches</entry>
<entry>Notes</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>C</literal></entry>
<entry>Other</entry>
<entry></entry>
</row>
<row>
<entry><literal>Cc</literal></entry>
<entry>Control</entry>
<entry></entry>
</row>
<row>
<entry><literal>Cf</literal></entry>
<entry>Format</entry>
<entry></entry>
</row>
<row>
<entry><literal>Cn</literal></entry>
<entry>Unassigned</entry>
<entry></entry>
</row>
<row>
<entry><literal>Co</literal></entry>
<entry>Private use</entry>
<entry></entry>
</row>
<row rowsep="1">
<entry><literal>Cs</literal></entry>
<entry>Surrogate</entry>
<entry></entry>
</row>
<row>
<entry><literal>L</literal></entry>
<entry>Letter</entry>
<entry>
Includes the following properties: <literal>Ll</literal>,
<literal>Lm</literal>, <literal>Lo</literal>, <literal>Lt</literal> and
<literal>Lu</literal>.
</entry>
</row>
<row>
<entry><literal>Ll</literal></entry>
<entry>Lower case letter</entry>
<entry></entry>
</row>
<row>
<entry><literal>Lm</literal></entry>
<entry>Modifier letter</entry>
<entry></entry>
</row>
<row>
<entry><literal>Lo</literal></entry>
<entry>Other letter</entry>
<entry></entry>
</row>
<row>
<entry><literal>Lt</literal></entry>
<entry>Title case letter</entry>
<entry></entry>
</row>
<row rowsep="1">
<entry><literal>Lu</literal></entry>
<entry>Upper case letter</entry>
<entry></entry>
</row>
<row>
<entry><literal>M</literal></entry>
<entry>Mark</entry>
<entry></entry>
</row>
<row>
<entry><literal>Mc</literal></entry>
<entry>Spacing mark</entry>
<entry></entry>
</row>
<row>
<entry><literal>Me</literal></entry>
<entry>Enclosing mark</entry>
<entry></entry>
</row>
<row rowsep="1">
<entry><literal>Mn</literal></entry>
<entry>Non-spacing mark</entry>
<entry></entry>
</row>
<row>
<entry><literal>N</literal></entry>
<entry>Number</entry>
<entry></entry>
</row>
<row>
<entry><literal>Nd</literal></entry>
<entry>Decimal number</entry>
<entry></entry>
</row>
<row>
<entry><literal>Nl</literal></entry>
<entry>Letter number</entry>
<entry></entry>
</row>
<row rowsep="1">
<entry><literal>No</literal></entry>
<entry>Other number</entry>
<entry></entry>
</row>
<row>
<entry><literal>P</literal></entry>
<entry>Punctuation</entry>
<entry></entry>
</row>
<row>
<entry><literal>Pc</literal></entry>
<entry>Connector punctuation</entry>
<entry></entry>
</row>
<row>
<entry><literal>Pd</literal></entry>
<entry>Dash punctuation</entry>
<entry></entry>
</row>
<row>
<entry><literal>Pe</literal></entry>
<entry>Close punctuation</entry>
<entry></entry>
</row>
<row>
<entry><literal>Pf</literal></entry>
<entry>Final punctuation</entry>
<entry></entry>
</row>
<row>
<entry><literal>Pi</literal></entry>
<entry>Initial punctuation</entry>
<entry></entry>
</row>
<row>
<entry><literal>Po</literal></entry>
<entry>Other punctuation</entry>
<entry></entry>
</row>
<row rowsep="1">
<entry><literal>Ps</literal></entry>
<entry>Open punctuation</entry>
<entry></entry>
</row>
<row>
<entry><literal>S</literal></entry>
<entry>Symbol</entry>
<entry></entry>
</row>
<row>
<entry><literal>Sc</literal></entry>
<entry>Currency symbol</entry>
<entry></entry>
</row>
<row>
<entry><literal>Sk</literal></entry>
<entry>Modifier symbol</entry>
<entry></entry>
</row>
<row>
<entry><literal>Sm</literal></entry>
<entry>Mathematical symbol</entry>
<entry></entry>
</row>
<row rowsep="1">
<entry><literal>So</literal></entry>
<entry>Other symbol</entry>
<entry></entry>
</row>
<row>
<entry><literal>Z</literal></entry>
<entry>Separator</entry>
<entry></entry>
</row>
<row>
<entry><literal>Zl</literal></entry>
<entry>Line separator</entry>
<entry></entry>
</row>
<row>
<entry><literal>Zp</literal></entry>
<entry>Paragraph separator</entry>
<entry></entry>
</row>
<row>
<entry><literal>Zs</literal></entry>
<entry>Space separator</entry>
<entry></entry>
</row>
</tbody>
</tgroup>
</table>
<para>
Extended properties such as "Greek" or "InMusicalSymbols" are not
supported by PCRE.
</para>
<para>
Specifying case-insensitive (caseless) matching does not affect these escape sequences.
For example, <literal>\p{Lu}</literal> always matches only upper case letters.
</para>
<para>
The <literal>\X</literal> escape matches any number of Unicode characters
that form an extended Unicode sequence. <literal>\X</literal> is equivalent
to <literal>(?>\PM\pM*)</literal>.
</para>
<para>
That is, it matches a character without the "mark" property, followed
by zero or more characters with the "mark" property, and treats the
sequence as an atomic group (see below). Characters with the "mark"
property are typically accents that affect the preceding character.
</para>
<para>
Matching characters by Unicode property is not fast, because PCRE has
to search a structure that contains data for over fifteen thousand
characters. That is why the traditional escape sequences such as
<literal>\d</literal> and <literal>\w</literal> do not use Unicode properties
in PCRE.
</para>
</section>
<section xml:id="regexp.reference.anchors">
<title>I caratteri "^" e "$"</title>
<para>
In condizioni normali, il carattere "^", posto all'esterno di una classe di
caratteri, indica un asserzione che è vera soltanto se il punto da cui si inizia
a identificare il testo si trova all'inizio della stringa oggetto della ricerca.
Al contrario, se il carattere "^" si trova all'interno di una classe di
caratteri, assume altri significati (vedere i capitoli seguenti).
</para>
<para>
Non è necessario che il carattere "^" sia la prima lettera
del criterio di riconoscimento nei casi in cui si utilizzino dei criteri di
riconoscimento alternativi. Tuttavia è necessario che sia la prima lettera
nei rami alternativi in cui compare. Se si inserisce il carattere "^"
in tutte le alternative, caso che ricorre quando si vuole riconoscere un testo a partire
dall'inizio della stringa, si dice che si è costruito un criterio
di ricerca "ancorato". (Esistono anche altre costruzioni che
portano all'ancoraggio di un criterio di ricerca).
</para>
<para>
Il carattere dollaro "$" è una asserzione che è &true; soltanto se il punto a cui
si è arrivati ad identificare il testo si trova alla fine della stringa oggetto
della ricerca, o nella lettera immediatamente precedente il carattere di "a capo",
che (per default) è l'ultimo carattere del testo. Il dollaro "$" non deve essere
necessariamente l'ultima lettera di un criterio di riconoscimento se in questo si
sono utilizzati dei criteri alternativi. Deve, comunque, essere l'ultima lettera
nei criteri ove compare. Il carattere dollaro "$" non ha significati speciali
all'interno di una classe di caratteri.
</para>
<para>
Il comportamento del simbolo "$" può essere variato in modo
da identificare la reale fine della stringa oggetto di ricerca attivando il flag
<link linkend="reference.pcre.pattern.modifiers">PCRE_DOLLAR_ENDONLY</link>
durante la compilazione o durante la fase di riconoscimento. Ciò non influisce sull'asserzione \Z.
</para>
<para>
Il comportamento dei simboli "^" e "$" può essere influenzato
dall'opzione <link linkend="reference.pcre.pattern.modifiers">PCRE_MULTILINE</link>. Quando viene
attivata, questi caratteri identificano rispettivamente,
oltre ai tradizionali inizio e fine testo, la lettera immediatamente
successiva ed immediatamente precedente il carattere "\n" presente
all'interno della stringa oggetto di ricerca. Per esempio il
criterio /^abc$/ riconosce il testo "def\nabc" solo in modalità
multi-linea. Di conseguenza i criteri di riconoscimento che
sono "ancorati" in modalità singola linea, non lo sono in modalità
multi-linea. L'opzione
<link linkend="reference.pcre.pattern.modifiers">PCRE_DOLLAR_ENDONLY</link>
viene ignorata se si attiva il flag
<link linkend="reference.pcre.pattern.modifiers">PCRE_MULTILINE</link>
.
</para>
<para>
Occorre rilevare che le sequenze \A, \Z e \z possono essere utilizzate per riconoscere
l'inizio e la fine del testo in entrambe le modalità, e, se tutti i criteri alternativi
iniziano con \A, si ha ancora un criterio "ancorato" a prescindere che sia attivata
o meno l'opzione <link linkend="reference.pcre.pattern.modifiers">PCRE_MULTILINE</link>
.
</para>
</section>
<section xml:id="regexp.reference.dot">
<title>Punto</title>
<para>
Il carattere punto ".", all'esterno di una classe di caratteri,
identifica qualsiasi carattere, anche quelli non stampabili,
ma (per default) non il carattere "a capo". Invece se si
abilita l'opzione <link linkend="reference.pcre.pattern.modifiers">PCRE_DOTALL</link>
si avrà anche il riconoscimento del carattere "a capo".
La gestione del simbolo "." è svincolata dalla gestione dei
simboli "^" ed "$", l'unica relazione che possono avere riguarda
il carattere "a capo". Il punto "." non ha significati speciali
all'interno delle classi di caratteri.
</para>
<para>
<emphasis>\C</emphasis> can be used to match single byte. It makes sense
in <emphasis>UTF-8 mode</emphasis> where full stop matches the whole
character which can consist of multiple bytes.
</para>
</section>
<section xml:id="regexp.reference.character-classes">
<title>Classi di caratteri</title>
<para>
Un parentesi quadrata aperta "[" inizia una classe di caratteri; una parentesi quadrata
chiusa "]" termina la definizione della classe. Di suo il carattere di parentesi
quadrata chiusa non ha significati speciali. Se occorre inserire la parentesi
chiusa all'interno di una classe di caratteri, questa deve
essere la prima lettera (ovviamente deve seguire il carattere "^",
se presente) oppure deve essere preceduta dal carattere di escape "\".
</para>
<para>
Una classe di caratteri identifica un singolo carattere nella stringa
oggetto di ricerca; il carattere deve comparire nel set di caratteri definito
dalla classe, a meno che il primo carattere della classe non sia l'accento
circonflesso "^", in tal caso il carattere non deve essere nel set definito
dalla classe. Se è richiesto l'inserimento del carattere "^" nel set definito
dalla classe, questo non deve essere la prima lettera dopo la parentesi di
apertura, oppure deve essere preceduto dal carattere di escape (\).
</para>
<para>
Ad esempio, la classe [aeiou] identifica ogni vocale minuscola,
mentre [^aeiou] identifica tutti i caratteri che non siano
delle vocali minuscole. Occorre notare che il simbolo "^" è
un modo pratico per indicare i caratteri che sono nella
classe, citando quelli che non lo sono. Questa non è una
asserzione: consuma un carattere della stringa oggetto
di ricerca e fallisce se ci si trova alla fine
del testo.
</para>
<para>
In un riconoscimento senza distinzione tra minuscole e maiuscole,
ogni lettera della classe identifica sia la versione maiuscola
sia la minuscola. Così, ad esempio, la classe [aeiou] identifica
sia "A" sia "a", e, in questo caso, [^aeiou] non identifica "A",
mentre con la distinzione delle maiuscole [^aeiou] identifica la lettera "A".
</para>
<para>
Il carattere di "a capo" (newline) non viene trattato in
modo speciale nelle classi di caratteri, indipendentemente
dalle opzioni <link linkend="reference.pcre.pattern.modifiers">PCRE_DOTALL</link>
o <link linkend="reference.pcre.pattern.modifiers">PCRE_MULTILINE</link>.
La classe [^a] riconosce sempre il carattere "a capo".
</para>
<para>
Il segno meno (-) può essere usato per definire un intervallo
all'interno della classe. Ad esempio, [d-m] identifica ogni
lettera compresa tra d ed m inclusi. Se occorre inserire il segno