Bindestreg inde i sæt i PHP regulære udtryk
Bindestreg - er også et specialtegn inde i []
(men udenfor - ikke). Hvis du har brug for selve
bindestregen som symbol - så placer den der,
hvor den ikke vil blive opfattet som en gruppeseparator.
Hvorfor dette er vigtigt: du kan utilsigtet lave en gruppe
af symboler. For eksempel, sådan her - [:-@] - du tror, at
du vælger kolon, bindestreg og at-tegn (@), men
i virkeligheden får du en gruppe af symboler mellem
: og @. Denne gruppe inkluderer
følgende symboler: :, ;, ?,
<, =, >.
Hvor kommer de fra? Fra ASCII-tabellen - kolon har et nummer, der er lavere end at-tegn (@) - og det resulterer i en gruppe. Det vil sige, at alle grupper opstår baseret på ASCII-tabellen (hvis man ønsker det, kan man bruge dette til sin fordel).
Hvordan man håndterer dette: placer bindestreg-symbolet
et sted, hvor det helt sikkert ikke vil blive opfattet som et
gruppesymbol, for eksempel i starten eller slutningen
(altså efter [ eller før ]).
Man kan også escape bindestregen - så
vil den altid repræsentere sig selv, uanset
position. For eksempel, i stedet for [:-@] skrive
[:\-@] - og så vil der ikke være nogen gruppe, men
der vil være tre symboler - kolon, bindestreg og at-tegn @.
Eksempel
I det følgende eksempel er søgemønsteret som følger:
ciffer 1, derefter bogstav fra 'a'
til 'z', derefter ciffer 2:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[a-z]2#', '!', $str);
?>
Resultatet i variablen vil være følgende:
'! 1-2 ! !'
Eksempel
Lad os nu escape bindestregen. Resultatet
bliver at søgemønsteret er som følger: ciffer 1, derefter
bogstav 'a', eller bindestreg, eller bogstav 'z',
derefter ciffer 2:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[a\-z]2#', '!', $str);
?>
Resultatet i variablen vil være følgende:
'! ! 1c2 !'
Eksempel
Man kan blot flytte bindestregen uden at escape den:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[az-]2#', '!', $str);
?>
Resultatet i variablen vil være følgende:
'! ! 1c2 !'
Eksempel
I det følgende eksempel er søgemønsteret som følger:
første symbol er enten små bogstaver eller
bindestreg '-', derefter to bogstaver 'x':
<?php
$str = 'axx Axx -xx @xx';
$res = preg_replace('#[a-z-]xx#', '!', $str);
?>
Resultatet i variablen vil være følgende:
'! Axx ! @xx'
Eksempel
I det følgende eksempel er søgemønsteret som følger:
første symbol er enten små, store
bogstaver eller bindestreg '-', derefter to bogstaver
'x':
<?php
$str = 'axx Axx -xx @xx';
$res = preg_replace('#[a-zA-Z-]xx#', '!', $str);
?>
Resultatet i variablen vil være følgende:
'! ! ! @xx'
Eksempel
Man kan placere bindestregen mellem to grupper - der vil den helt sikkert ikke skabe en yderligere gruppe:
<?php
$str = 'axx 9xx -xx @xx';
$res = preg_replace('#[a-z-0-9]xx#', '!', $str);
?>
Resultatet i variablen vil være følgende:
'! ! ! @xx'
Praktiske opgaver
Givet en streng:
<?php
$str = 'xaz xBz xcz x-z x@z';
?>
Find alle strenge efter følgende mønster:
bogstav 'x', stort eller småt
bogstav eller bindestreg, bogstav 'z'.
Givet en streng:
<?php
$str = 'xaz x$z x-z xcz x+z x%z x*z';
?>
Find alle strenge efter følgende mønster:
bogstav 'x', derefter enten dollar, eller
bindestreg eller plus, derefter bogstav 'z'.