Der Bindestrich innerhalb von Zeichenklassen in regulären PHP-Ausdrücken
Der Bindestrich ist auch ein Sonderzeichen innerhalb von []
(außerhalb hingegen nicht). Wenn Sie den Bindestrich selbst als Symbol benötigen
- dann platzieren Sie ihn dort,
wo er nicht als Trennzeichen für eine Zeichengruppe
interpretiert wird.
Warum das wichtig ist: Sie können eine Zeichengruppe erstellen,
ohne es zu bemerken. Zum Beispiel
so - [:-@] - Sie denken, Sie wählen den Doppelpunkt, den Bindestrich und das @-Zeichen aus,
aber tatsächlich ergibt sich eine Gruppe von Zeichen zwischen
: und @. Zu dieser Gruppe gehören
die folgenden Zeichen: :, ;, ?,
<, =, >.
Woher kommen sie? Aus der ASCII-Tabelle - der Doppelpunkt hat eine niedrigere Nummer als das @-Zeichen - und so entsteht eine Gruppe. Das heißt, alle Gruppen werden gemäß der ASCII-Tabelle gebildet (was man sich bei Bedarf zunutze machen kann).
Wie man damit umgeht: Setzen Sie das Bindestrich-Symbol
dorthin, wo es definitiv nicht als Symbol für eine Gruppe
interpretiert wird, zum Beispiel an den Anfang oder an das Ende
(d.h. nach [ oder vor ]).
Man kann den Bindestrich auch maskieren - dann
wird er unabhängig von der Position sich selbst bedeuten.
Zum Beispiel, anstelle von [:-@] schreibt man
[:\-@] - und es gibt keine Gruppe mehr, sondern
drei Zeichen - Doppelpunkt, Bindestrich und das @-Zeichen.
Beispiel
Im folgenden Beispiel ist das Suchmuster wie folgt:
Ziffer 1, dann ein Buchstabe von 'a'
bis 'z', dann Ziffer 2:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[a-z]2#', '!', $str);
?>
Als Ergebnis wird in die Variable Folgendes geschrieben:
'! 1-2 ! !'
Beispiel
Lassen Sie uns nun den Bindestrich maskieren. Im Ergebnis
lautet das Suchmuster wie folgt: Ziffer 1, dann
Buchstabe 'a', oder Bindestrich, oder Buchstabe 'z',
dann Ziffer 2:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[a\-z]2#', '!', $str);
?>
Als Ergebnis wird in die Variable Folgendes geschrieben:
'! ! 1c2 !'
Beispiel
Man kann den Bindestrich einfach umstellen, ohne ihn zu maskieren:
<?php
$str = '1a2 1-2 1c2 1z2';
$res = preg_replace('#1[az-]2#', '!', $str);
?>
Als Ergebnis wird in die Variable Folgendes geschrieben:
'! ! 1c2 !'
Beispiel
Im folgenden Beispiel ist das Suchmuster wie folgt:
erstes Zeichen - das sind Kleinbuchstaben oder
Bindestrich '-', dann zwei Buchstaben 'x':
<?php
$str = 'axx Axx -xx @xx';
$res = preg_replace('#[a-z-]xx#', '!', $str);
?>
Als Ergebnis wird in die Variable Folgendes geschrieben:
'! Axx ! @xx'
Beispiel
Im folgenden Beispiel ist das Suchmuster wie folgt:
erstes Zeichen - das sind Kleinbuchstaben, Großbuchstaben
oder Bindestrich '-', dann zwei Buchstaben
'x':
<?php
$str = 'axx Axx -xx @xx';
$res = preg_replace('#[a-zA-Z-]xx#', '!', $str);
?>
Als Ergebnis wird in die Variable Folgendes geschrieben:
'! ! ! @xx'
Beispiel
Man kann den Bindestrich zwischen zwei Gruppen platzieren - dort wird er definitiv keine weitere Gruppe erzeugen:
<?php
$str = 'axx 9xx -xx @xx';
$res = preg_replace('#[a-z-0-9]xx#', '!', $str);
?>
Als Ergebnis wird in die Variable Folgendes geschrieben:
'! ! ! @xx'
Praktische Aufgaben
Gegeben sei der String:
<?php
$str = 'xaz xBz xcz x-z x@z';
?>
Finden Sie alle Strings nach dem folgenden Muster:
Buchstabe 'x', Groß- oder Kleinbuchstabe
oder Bindestrich, Buchstabe 'z'.
Gegeben sei der String:
<?php
$str = 'xaz x$z x-z xcz x+z x%z x*z';
?>
Finden Sie alle Strings nach dem folgenden Muster:
Buchstabe 'x', dann entweder Dollar-Zeichen, oder
Bindestrich oder Plus-Zeichen, dann Buchstabe 'z'.