Bindestreck inom uppsättningar i PHP reguljära uttryck
Bindestreck är också ett specialtecken inom []
(men utanför - inte). Om du behöver själva
bindestrecket som ett tecken - placera det där,
där det inte kommer att uppfattas som en avgränsare
för en grupp.
Varför detta är viktigt: du kan skapa en grupp
av tecken utan att märka det. Till exempel,
så här - [:-@] - du tror att du
väljer kolon, bindestreck och snabel-a, men
i verkligheten blir det en grupp tecken mellan
: och @. Denna grupp inkluderar
följande tecken: :, ;, ?,
<, =, >.
Var kommer de ifrån? Från ASCII-tabellen - kolon har ett lägre nummer än snabel-a - och därmed bildas en grupp. Det vill säga alla grupper bildas enligt ASCII-tabellen (om så önskas kan man använda detta).
Hur man hanterar detta: placera bindestreckstecknet
där det definitivt inte kommer att uppfattas som ett
grupptecken, till exempel i början eller slutet
(det vill säga efter [ eller före ]).
Man kan också escapea bindestrecket - då
kommer det att representera sig själv oavsett
position. Till exempel, istället för [:-@] skriva
[:\-@] - och då finns det ingen grupp, utan
det blir tre tecken - kolon, bindestreck och snabel-a @.
Exempel
I följande exempel är sökmönstret så här:
siffra 1, sedan bokstav från 'a'
till 'z', sedan siffra 2:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[a-z]2#', '!', $str);
?>
Som ett resultat kommer följande att skrivas till variabeln:
'! 1-2 ! !'
Exempel
Låt oss nu escapea bindestrecket. Som ett resultat
blir sökmönstret så här: siffra 1, sedan
bokstaven 'a', eller bindestreck, eller bokstaven 'z',
sedan siffra 2:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[a\-z]2#', '!', $str);
?>
Som ett resultat kommer följande att skrivas till variabeln:
'! ! 1c2 !'
Exempel
Man kan helt enkelt flytta om bindestrecket, utan att escapea det:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[az-]2#', '!', $str);
?>
Som ett resultat kommer följande att skrivas till variabeln:
'! ! 1c2 !'
Exempel
I följande exempel är sökmönstret så här:
första tecknet är små bokstäver eller
bindestreck '-', sedan två bokstäver 'x':
<?php
$str = 'axx Axx -xx @xx';
$res = preg_replace('#[a-z-]xx#', '!', $str);
?>
Som ett resultat kommer följande att skrivas till variabeln:
'! Axx ! @xx'
Exempel
I följande exempel är sökmönstret så här:
första tecknet är små eller stora
bokstäver eller bindestreck '-', sedan två bokstäver
'x':
<?php
$str = 'axx Axx -xx @xx';
$res = preg_replace('#[a-zA-Z-]xx#', '!', $str);
?>
Som ett resultat kommer följande att skrivas till variabeln:
'! ! ! @xx'
Exempel
Man kan placera bindestrecket mellan två grupper - där kommer det definitivt inte att skapa en ny grupp:
<?php
$str = 'axx 9xx -xx @xx';
$res = preg_replace('#[a-z-0-9]xx#', '!', $str);
?>
Som ett resultat kommer följande att skrivas till variabeln:
'! ! ! @xx'
Praktiska uppgifter
Given en sträng:
<?php
$str = 'xaz xBz xcz x-z x@z';
?>
Hitta alla strängar enligt följande mönster:
bokstaven 'x', stor eller liten
bokstav eller bindestreck, bokstaven 'z'.
Given en sträng:
<?php
$str = 'xaz x$z x-z xcz x+z x%z x*z';
?>
Hitta alla strängar enligt följande mönster:
bokstaven 'x', sedan antingen dollar,
bindestreck eller plus, sedan bokstaven 'z'.