Bindestrek inni sett i regulære uttrykk i PHP
Bindestrek - også et spesialtegn inni []
(men utenfor - ikke). Hvis du trenger selve
bindestreken som et tegn - plasser den der
den ikke vil bli oppfattet som en skilletegn
for en gruppe.
Hvorfor dette er viktig: du kan lage en gruppe
tegn uten å legge merke til det selv. For eksempel,
sånn som dette - [:-@] - du tror at du
velger kolon, bindestrek og krøllalfa, men
egentlig får du en gruppe tegn mellom
: og @. Denne gruppen inkluderer
følgende tegn: :, ;, ?,
<, =, >.
Hvor kommer de fra? Fra ASCII-tabellen - kolon har et lavere nummer enn krøllalfa - og det blir en gruppe. Det vil si at alle grupper blir dannet i henhold til ASCII-tabellen (om ønskelig kan man bruke dette).
Hvordan håndtere dette: plasser bindestrek-tegnet
der det helt sikkert ikke vil bli oppfattet som
et gruppetegn, for eksempel, i begynnelsen eller på slutten
(altså etter [ eller før ]).
Man kan også escape bindestreken - da
vil den representere seg selv uavhengig av
posisjonen. For eksempel, i stedet for [:-@] skrive
[:\-@] - og da vil det ikke være noen gruppe, men
det vil være tre tegn - kolon, bindestrek og krøllalfa @.
Eksempel
I det følgende eksemplet er søkemønsteret som følger:
siffer 1, deretter bokstav fra 'a'
til 'z', deretter siffer 2:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[a-z]2#', '!', $str);
?>
Resultatet som skrives til variabelen er som følger:
'! 1-2 ! !'
Eksempel
La oss nå escape bindestreken. Resultatet
blir at søkemønsteret er som følger: siffer 1, deretter
bokstav 'a', eller bindestrek, eller bokstav 'z',
deretter siffer 2:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[a\-z]2#', '!', $str);
?>
Resultatet som skrives til variabelen er som følger:
'! ! 1c2 !'
Eksempel
Man kan ganske enkelt flytte bindestreken, uten å escape den:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[az-]2#', '!', $str);
?>
Resultatet som skrives til variabelen er som følger:
'! ! 1c2 !'
Eksempel
I det følgende eksemplet er søkemønsteret som følger:
første tegn er små bokstaver eller
bindestrek '-', deretter to bokstaver 'x':
<?php
$str = 'axx Axx -xx @xx';
$res = preg_replace('#[a-z-]xx#', '!', $str);
?>
Resultatet som skrives til variabelen er som følger:
'! Axx ! @xx'
Eksempel
I det følgende eksemplet er søkemønsteret som følger:
første tegn er små, store
bokstaver eller bindestrek '-', deretter to bokstaver
'x':
<?php
$str = 'axx Axx -xx @xx';
$res = preg_replace('#[a-zA-Z-]xx#', '!', $str);
?>
Resultatet som skrives til variabelen er som følger:
'! ! ! @xx'
Eksempel
Man kan plassere bindestreken mellom to grupper - der vil den helt sikkert ikke lage en ny gruppe:
<?php
$str = 'axx 9xx -xx @xx';
$res = preg_replace('#[a-z-0-9]xx#', '!', $str);
?>
Resultatet som skrives til variabelen er som følger:
'! ! ! @xx'
Praktiske oppgaver
Gitt en streng:
<?php
$str = 'xaz xBz xcz x-z x@z';
?>
Finn alle strenger som følger dette mønsteret:
bokstav 'x', stor eller liten
bokstav eller bindestrek, bokstav 'z'.
Gitt en streng:
<?php
$str = 'xaz x$z x-z xcz x+z x%z x*z';
?>
Finn alle strenger som følger dette mønsteret:
bokstav 'x', deretter enten dollartegn, eller
bindestrek eller plusstegn, deretter bokstav 'z'.