Het koppelteken binnen sets in PHP reguliere expressies
Het koppelteken - is ook een speciaal symbool binnen []
(maar daarbuiten - niet). Als je het koppelteken zelf nodig hebt
als symbool - plaats het dan daar,
waar het niet wordt geïnterpreteerd als scheidingsteken
van een groep.
Waarom dit belangrijk is: je kunt per ongeluk een groep
symbolen maken. Bijvoorbeeld,
zo - [:-@] - je denkt dat je
een dubbele punt, een koppelteken en een apenstaartje selecteert, maar
in werkelijkheid krijg je een groep symbolen tussen
: en @. Deze groep bevat
de volgende symbolen: :, ;, ?,
<, =, >.
Waar komen ze vandaan? Uit de ASCII-tabel - de dubbele punt heeft een lager nummer dan de apenstaart - en zo ontstaat er een groep. Dat wil zeggen, alle groepen worden gevormd volgens de ASCII-tabel (je kunt dit gebruiken als je wilt).
Hoe dit op te lossen: plaats het koppelteken
waar het zeker niet wordt geïnterpreteerd als
groepsymbool, bijvoorbeeld aan het begin of aan het einde
(dat wil zeggen, na [ of voor ]).
Je kunt het koppelteken ook escapen - dan
zal het zichzelf vertegenwoordigen, ongeacht de
positie. Bijvoorbeeld, in plaats van [:-@] schrijf
[:\-@] - en er is geen groep meer, maar
drie symbolen - dubbele punt, koppelteken en apenstaartje @.
Voorbeeld
In het volgende voorbeeld is het zoekpatroon als volgt:
cijfer 1, dan letter van 'a'
tot 'z', dan cijfer 2:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[a-z]2#', '!', $str);
?>
Als resultaat wordt het volgende in de variabele opgeslagen:
'! 1-2 ! !'
Voorbeeld
Laten we nu het koppelteken escapen. Als resultaat
is het zoekpatroon als volgt: cijfer 1, dan
letter 'a', of koppelteken, of letter 'z',
dan cijfer 2:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[a\-z]2#', '!', $str);
?>
Als resultaat wordt het volgende in de variabele opgeslagen:
'! ! 1c2 !'
Voorbeeld
Je kunt het koppelteken eenvoudig verplaatsen, zonder het te escapen:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[az-]2#', '!', $str);
?>
Als resultaat wordt het volgende in de variabele opgeslagen:
'! ! 1c2 !'
Voorbeeld
In het volgende voorbeeld is het zoekpatroon als volgt:
eerste symbool - dit zijn kleine letters of
een koppelteken '-', dan twee letters 'x':
<?php
$str = 'axx Axx -xx @xx';
$res = preg_replace('#[a-z-]xx#', '!', $str);
?>
Als resultaat wordt het volgende in de variabele opgeslagen:
'! Axx ! @xx'
Voorbeeld
In het volgende voorbeeld is het zoekpatroon als volgt:
eerste symbool - dit zijn kleine, hoofd-
letters of een koppelteken '-', dan twee letters
'x':
<?php
$str = 'axx Axx -xx @xx';
$res = preg_replace('#[a-zA-Z-]xx#', '!', $str);
?>
Als resultaat wordt het volgende in de variabele opgeslagen:
'! ! ! @xx'
Voorbeeld
Je kunt het koppelteken tussen twee groepen plaatsen - daar zal het zeker geen extra groep creëren:
<?php
$str = 'axx 9xx -xx @xx';
$res = preg_replace('#[a-z-0-9]xx#', '!', $str);
?>
Als resultaat wordt het volgende in de variabele opgeslagen:
'! ! ! @xx'
Praktische opdrachten
Gegeven een string:
<?php
$str = 'xaz xBz xcz x-z x@z';
?>
Vind alle strings volgens het volgende patroon:
letter 'x', hoofd- of kleine
letter of koppelteken, letter 'z'.
Gegeven een string:
<?php
$str = 'xaz x$z x-z xcz x+z x%z x*z';
?>
Vind alle strings volgens het volgende patroon:
letter 'x', dan of dollarteken, of
koppelteken of plusteken, dan letter 'z'.