Myślnik wewnątrz zestawów w wyrażeniach regularnych PHP
Myślnik - również jest symbolem specjalnym wewnątrz []
(a na zewnątrz - nie). Jeśli potrzebujesz samego
myślnika jako symbolu - umieść go tam,
gdzie nie zostanie zinterpretowany jako separator
grupowy.
Dlaczego to ważne: możesz utworzyć grupę
symboli, samemu tego nie zauważając. Na przykład,
tak - [:-@] - myślisz, że
wybierasz dwukropek, myślnik i małpę, a w
rzeczywistości otrzymujesz grupę symboli pomiędzy
: i @. W skład tej grupy wchodzą
następujące symbole: :, ;, ?,
<, =, >.
Skąd się wzięły? Z tabeli ASCII - dwukropek ma mniejszy numer niż małpa - i otrzymujemy grupę. Oznacza to, że wszystkie grupy powstają na podstawie tabeli ASCII (w razie potrzeby można z tego korzystać).
Jak z tym walczyć: umieść symbol myślnika
tam, gdzie na pewno nie zostanie zinterpretowany jako
symbol grupy, na przykład na początku lub na końcu
(czyli po [ lub przed ]).
Można również wyescapować myślnik - wtedy
będzie on oznaczał sam siebie niezależnie od
pozycji. Na przykład, zamiast [:-@] napisać
[:\-@] - i grupy już nie będzie, a
będą trzy symbole - dwukropek, myślnik i małpa @.
Przykład
W następnym przykładzie wzorzec wyszukiwania jest następujący:
cyfra 1, następnie litera od 'a'
do 'z', następnie cyfra 2:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[a-z]2#', '!', $str);
?>
W rezultacie do zmiennej zostanie zapisane następujące:
'! 1-2 ! !'
Przykład
Teraz wyescapujmy myślnik. W rezultacie
wzorzec wyszukiwania jest następujący: cyfra 1, następnie
litera 'a', lub myślnik, lub litera 'z',
następnie cyfra 2:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[a\-z]2#', '!', $str);
?>
W rezultacie do zmiennej zostanie zapisane następujące:
'! ! 1c2 !'
Przykład
Można po prostu przesunąć myślnik, nie escapując go:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[az-]2#', '!', $str);
?>
W rezultacie do zmiennej zostanie zapisane następujące:
'! ! 1c2 !'
Przykład
W następnym przykładzie wzorzec wyszukiwania jest następujący:
pierwszy symbol - to małe litery lub
myślnik '-', potem dwie litery 'x':
<?php
$str = 'axx Axx -xx @xx';
$res = preg_replace('#[a-z-]xx#', '!', $str);
?>
W rezultacie do zmiennej zostanie zapisane następujące:
'! Axx ! @xx'
Przykład
W następnym przykładzie wzorzec wyszukiwania jest następujący:
pierwszy symbol - to małe, duże
litery lub myślnik '-', potem dwie litery
'x':
<?php
$str = 'axx Axx -xx @xx';
$res = preg_replace('#[a-zA-Z-]xx#', '!', $str);
?>
W rezultacie do zmiennej zostanie zapisane następujące:
'! ! ! @xx'
Przykład
Można umieścić myślnik pomiędzy dwiema grupami - tam na pewno nie utworzy jeszcze jednej grupy:
<?php
$str = 'axx 9xx -xx @xx';
$res = preg_replace('#[a-z-0-9]xx#', '!', $str);
?>
W rezultacie do zmiennej zostanie zapisane następujące:
'! ! ! @xx'
Zadania praktyczne
Dany jest ciąg:
<?php
$str = 'xaz xBz xcz x-z x@z';
?>
Znajdź wszystkie ciągi według następującego wzorca:
litera 'x', duża lub mała
litera lub myślnik, litera 'z'.
Dany jest ciąg:
<?php
$str = 'xaz x$z x-z xcz x+z x%z x*z';
?>
Znajdź wszystkie ciągi według następującego wzorca:
litera 'x', następnie lub dolar, lub
myślnik lub plus, potem litera 'z'.