Trattino all'interno di set nelle espressioni regolari PHP
Il trattino è anch'esso un carattere speciale all'interno di []
(ma all'esterno - no). Se avete bisogno del trattino stesso
come carattere - mettetelo dove non verrà interpretato come separatore
di un intervallo.
Perché è importante: potreste creare un intervallo
di caratteri senza accorgervene. Ad esempio,
così - [:-@] - pensate di selezionare
il due punti, il trattino e la chiocciola, ma in
realtà ottenete un intervallo di caratteri tra
: e @. In questo intervallo sono inclusi
i seguenti caratteri: :, ;, ?,
<, =, >.
Da dove vengono? Dalla tabella ASCII - il due punti ha un numero inferiore alla chiocciola - e si ottiene un intervallo. Cioè tutti gli intervalli sono determinati dalla tabella ASCII (volendo ci si può fare affidamento).
Come rimediare: mettete il carattere trattino
dove sicuramente non verrà interpretato come
carattere di intervallo, ad esempio, all'inizio o alla fine
(cioè dopo [ o prima di ]).
Si può anche escape il trattino - in questo caso
indicherà sé stesso indipendentemente dalla
posizione. Ad esempio, invece di [:-@] scrivere
[:\-@] - e non ci sarà più un intervallo, ma
ci saranno tre caratteri - due punti, trattino e chiocciola @.
Esempio
Nel seguente esempio il modello di ricerca è questo:
cifra 1, poi una lettera da 'a'
a 'z', poi cifra 2:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[a-z]2#', '!', $str);
?>
Di conseguenza nella variabile verrà memorizzato quanto segue:
'! 1-2 ! !'
Esempio
Ora escape il trattino. Di conseguenza
il modello di ricerca è questo: cifra 1, poi
lettera 'a', o trattino, o lettera 'z',
poi cifra 2:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[a\-z]2#', '!', $str);
?>
Di conseguenza nella variabile verrà memorizzato quanto segue:
'! ! 1c2 !'
Esempio
Si può semplicemente spostare il trattino, senza escapearlo:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[az-]2#', '!', $str);
?>
Di conseguenza nella variabile verrà memorizzato quanto segue:
'! ! 1c2 !'
Esempio
Nel seguente esempio il modello di ricerca è questo:
il primo carattere è una lettera minuscola o
un trattino '-', poi due lettere 'x':
<?php
$str = 'axx Axx -xx @xx';
$res = preg_replace('#[a-z-]xx#', '!', $str);
?>
Di conseguenza nella variabile verrà memorizzato quanto segue:
'! Axx ! @xx'
Esempio
Nel seguente esempio il modello di ricerca è questo:
il primo carattere è una lettera minuscola, maiuscola
o un trattino '-', poi due lettere
'x':
<?php
$str = 'axx Axx -xx @xx';
$res = preg_replace('#[a-zA-Z-]xx#', '!', $str);
?>
Di conseguenza nella variabile verrà memorizzato quanto segue:
'! ! ! @xx'
Esempio
Si può posizionare il trattino tra due intervalli - lì sicuramente non creerà un altro intervallo:
<?php
$str = 'axx 9xx -xx @xx';
$res = preg_replace('#[a-z-0-9]xx#', '!', $str);
?>
Di conseguenza nella variabile verrà memorizzato quanto segue:
'! ! ! @xx'
Problemi pratici
Data la stringa:
<?php
$str = 'xaz xBz xcz x-z x@z';
?>
Trovate tutte le stringhe secondo il seguente modello:
lettera 'x', lettera maiuscola o minuscola
o trattino, lettera 'z'.
Data la stringa:
<?php
$str = 'xaz x$z x-z xcz x+z x%z x*z';
?>
Trovate tutte le stringhe secondo il seguente modello:
lettera 'x', poi o dollaro, o
trattino o più, poi lettera 'z'.