Kötőjel a halmazokon belül a PHP reguláris kifejezéseiben
A kötőjel - szintén speciális karakter a [] belsejében
(kívül viszont - nem). Ha magát a kötőjelet szeretnéd használni
karakterként - helyezd oda,
ahol nem fogják csoportelválasztóként értelmezni.
Miért fontos ez: létrehozhatsz egy karaktercsoportot
anélkül, hogy észrevennéd. Például,
így - [:-@] - azt gondolod, hogy
kettőspontot, kötőjelet és kukacot választasz ki, de
valójában a : és a @ közötti
karakterek csoportját kapod. Ebbe a csoportba a
következő karakterek tartoznak: :, ;, ?,
<, =, >.
Honnan jönnek? Az ASCII táblázatból - a kettőspontnak kisebb a sorszáma, mint a kukacnak - és így jön létre a csoport. Vagyis minden csoport az ASCII tábla szerint jön létre (ezt használhatod is, ha akarod).
Hogyan kezeljük ezt: helyezd a kötőjel karaktert
oda, ahol biztosan nem fogják csoportként
értelmezni, például az elejére vagy a végére
(tehát a [ után vagy a ] elé).
A kötőjelet escape-elheted is - ekkor
önmagát fogja jelölni, függetlenül a
helyzetétől. Például a [:-@] helyett írd
[:\-@] - és már nem lesz csoport, hanem
három karakter lesz - kettőspont, kötőjel és kukac @.
Példa
A következő példában a keresési minta a következő:
1 szám, majd 'a'-tól
'z'-ig betű, majd 2 szám:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[a-z]2#', '!', $str);
?>
Ennek eredményeképpen a változóba a következő íródik:
'! 1-2 ! !'
Példa
Most escape-eljük a kötőjelet. Ennek eredményeképpen
a keresési minta a következő: 1 szám, majd
'a' betű, vagy kötőjel, vagy 'z' betű,
majd 2 szám:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[a\-z]2#', '!', $str);
?>
Ennek eredményeképpen a változóba a következő íródik:
'! ! 1c2 !'
Példa
Egyszerűen áthelyezhetjük a kötőjelet anélkül, hogy escape-elnénk:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[az-]2#', '!', $str);
?>
Ennek eredményeképpen a változóba a következő íródik:
'! ! 1c2 !'
Példa
A következő példában a keresési minta a következő:
első karakter - kisbetűk vagy
kötőjel '-', majd két 'x' betű:
<?php
$str = 'axx Axx -xx @xx';
$res = preg_replace('#[a-z-]xx#', '!', $str);
?>
Ennek eredményeképpen a változóba a következő íródik:
'! Axx ! @xx'
Példa
A következő példában a keresési minta a következő:
első karakter - kisbetűk, nagybetűk
vagy kötőjel '-', majd két 'x' betű:
<?php
$str = 'axx Axx -xx @xx';
$res = preg_replace('#[a-zA-Z-]xx#', '!', $str);
?>
Ennek eredményeképpen a változóba a következő íródik:
'! ! ! @xx'
Példa
A kötőjelet két csoport közé is helyezhetjük - ott biztosan nem fog még egy csoportot létrehozni:
<?php
$str = 'axx 9xx -xx @xx';
$res = preg_replace('#[a-z-0-9]xx#', '!', $str);
?>
Ennek eredményeképpen a változóba a következő íródik:
'! ! ! @xx'
Gyakorlati feladatok
Adott egy sztring:
<?php
$str = 'xaz xBz xcz x-z x@z';
?>
Keress meg minden sztringet a következő minta szerint:
'x' betű, nagy vagy kis
betű vagy kötőjel, 'z' betű.
Adott egy sztring:
<?php
$str = 'xaz x$z x-z xcz x+z x%z x*z';
?>
Keress meg minden sztringet a következő minta szerint:
'x' betű, majd vagy dollár, vagy
kötőjel vagy plusz, majd 'z' betű.