Defis znotraj nizov v regularnih izrazih PHP
Defis - tudi poseben znak znotraj []
(zunaj - pa ne). Če potrebujete sam defis kot simbol - ga postavite tja,
kjer ne bo razumljen kot ločilo skupine.
Zakaj je to pomembno: lahko nenamerno ustvarite skupino
simbolov. Na primer,
tako - [:-@] - mislite, da
izbirate dvopičje, defis in znak @, v
resnici pa dobite skupino simbolov med
: in @. V to skupino spadajo
naslednji simboli: :, ;, ?,
<, =, >.
Od kod so prišli? Iz tabele ASCII - dvopičje ima manjšo številko kot znak @ - in tako nastane skupina. To pomeni, da so vse skupine določene po ASCII tabeli (po želji lahko to uporabite).
Kako se s tem spopasti: postavite simbol defisa
tja, kjer zagotovo ne bo razumljen kot
simbol skupine, na primer, na začetku ali na koncu
(to je po [ ali pred ]).
Defis lahko tudi escapirate - potem
bo pomenil sam sebe ne glede na
položaj. Na primer, namesto [:-@] napisati
[:\-@] - in skupine ne bo več,
ampak bodo trije simboli - dvopičje, defis in znak @.
Primer
V naslednjem primeru je vzorec iskanja tak:
številka 1, nato črka od 'a'
do 'z', nato številka 2:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[a-z]2#', '!', $str);
?>
Kot rezultat se bo v spremenljivko zapisalo naslednje:
'! 1-2 ! !'
Primer
Zdaj pa escapirajmo defis. Kot rezultat
je vzorec iskanja tak: številka 1, nato
črka 'a', ali defis, ali črka 'z',
nato številka 2:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[a\-z]2#', '!', $str);
?>
Kot rezultat se bo v spremenljivko zapisalo naslednje:
'! ! 1c2 !'
Primer
Defis lahko preprosto prestavimo, ne da bi ga escapirali:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[az-]2#', '!', $str);
?>
Kot rezultat se bo v spremenljivko zapisalo naslednje:
'! ! 1c2 !'
Primer
V naslednjem primeru je vzorec iskanja tak:
prvi simbol - to so male črke ali
defis '-', nato dve črki 'x':
<?php
$str = 'axx Axx -xx @xx';
$res = preg_replace('#[a-z-]xx#', '!', $str);
?>
Kot rezultat se bo v spremenljivko zapisalo naslednje:
'! Axx ! @xx'
Primer
V naslednjem primeru je vzorec iskanja tak:
prvi simbol - to so male, velike
črke ali defis '-', nato dve črki
'x':
<?php
$str = 'axx Axx -xx @xx';
$res = preg_replace('#[a-zA-Z-]xx#', '!', $str);
?>
Kot rezultat se bo v spremenljivko zapisalo naslednje:
'! ! ! @xx'
Primer
Defis lahko postavimo med dve skupini - tam zagotovo ne bo naredil še ene skupine:
<?php
$str = 'axx 9xx -xx @xx';
$res = preg_replace('#[a-z-0-9]xx#', '!', $str);
?>
Kot rezultat se bo v spremenljivko zapisalo naslednje:
'! ! ! @xx'
Praktične naloge
Podan niz:
<?php
$str = 'xaz xBz xcz x-z x@z';
?>
Poiščite vse nize po naslednjem vzorcu:
črka 'x', velika ali mala
črka ali defis, črka 'z'.
Podan niz:
<?php
$str = 'xaz x$z x-z xcz x+z x%z x*z';
?>
Poiščite vse nize po naslednjem vzorcu:
črka 'x', nato ali dolar, ali
defis ali plus, nato črka 'z'.