Reguläre Ausdrücke

Reguläre Ausdrücke

Reguläre Ausdrücke sind Muster, um zu prüfen, ob eine Zeichenkette bestimmten Vorgaben entspricht. So prüft man z.B ob eine E-Mail Adresse die richtige Syntax hat.

Um reguläre Ausdrücke einzusetzten, kann die PHP-Funktion preg_match() verwendet werden. Diese Funktion sucht in einem String nach Übereinstimmungen und gibt, falls eine Übereinstimmung besteht, TRUE zurück. Dadurch wird geichzeitig die Suche nach weiteren Kongruenzen beendet. Ist dies nicht der Fall und es besteht keine Übereinstimmung, wird FALSE zurück gegeben.

Beispiel:

<?php

$string = 'Ich bin ein String';
$pattern = '/^[A-Za-z]+$/';

     if(preg_match($pattern,$string)){

          echo 'Es wurde eine Übereinstimmung gefunden!';

     }else{

          echo 'Es wurde keine Übereinstimmung gefunden!';

     }

In der Variable $string liegt der zu überprüfende String. In der Variable $pattern wird das Suchmuster festgelegt, welches folgendermaßen aufgebaut ist.

Die beiden Schrägstriche sind so genannte Delimiter und legen den Anfang und das Ende eines Musters fest.

Das erste ^ steht für den Anfang einer Zeichenkette und besagt, dass ein Suchmuster am Anfang einer Zeichenkette vorkommen muss.

In den eckigen Klammern wird eine Charakterklasse festgelegt, die eine Auswahl an bestimmten Zeichen angibt. Die Bindestriche geben die Reichweite der Charakterklasse an. Das Suchmuster im Beispiel beinhaltet nur zwei Charakterklasse A-Z und a-z. Der Zeichenkette im Beispiel wird so vorgeschrieben, dass nur Groß- und Kleinbuchstaben von A bis Z vorkommen dürfen und keine Ziffern oder Sonderzeichen. Mit den Pluszeichen wir erlaubt, dass ein Zeichen mehrfach in der Zeichenkette verwendet werden darf. Das Dollarzeichen stellt das Ende der Zeichenkette dar und übernimmt an dieser Stelle die Funktion des ^. Hier darf nicht das ^ stehen, da am Ende einer Zeichenkette das Suchmuster vorkommen muss.

Das Beispiel ist recht einfach gehalten und soll nur die Funktionsweise von Patterns darstellen. Es sind noch weitaus komplexere Vergleiche möglich.

Nach dem abschließenden Delimiter können noch so genannte Modifier angehauml;ngt werden, die das gesamte Suchmuster beeinflussen. So ist es z.B möglich die Groß-und Kleinschreibung zu deaktivieren.

Hier mal eine kleine Auflistung von ein einigen möglichen Modifier.

Man kann Modifier beliebig kombinieren.

Wie im obigen Beispiel schon gesehen, befinden sich vor und nach dem Suchmuster ein ^ und ein $.Diese Zeichen bezeichnet man als Metacharaktere, welche einen bestimmten Teil einer Zeichenkette bestimmen.

Es gibt folgende Metacharaktere:

. Der Punkt steht für jedes beliebige Zeichen einer Zeichenkette, ausgenommen einen Zeilenumbruch. Der Punkt würde nur einen Zeilenumbruch bedeuten, wenn der m Modifikator gleichzeitig eingesetzt werden würde.

Beispiel:

<?php

$string = 'Ich bin ein String';
$pattern = "/./";

     if( preg_match($pattern,$string) )
     {

          echo 'Es wurde eine Übereinstimmung gefunden';

     }else{

          echo 'Es wurde keine Übereinstimmung gefunden';

     }

?>
Die Funktion preg_match() würde im zuvor genannten Beispiel, egal was in der Variable $string steht, abgesehen von einem leeren String, immer Übereinstimmungen finden, da der "." wie schon erwähnt für jedes X-beliebige Zeichen steht.

^ Der Zirkumflex steht wie schon im ersten Beispiel erwähnt für den Anfang einer Zeichenkette.

Beispiel:

<?php

$string = 'abcdef';
$pattern = '/^abc/';
     if( preg_match($pattern,$string) ){

          echo 'Es wurde eine Übereinstimmung gefunden werden';

     }else{

          echo 'Es wurde keine Übereinstimmung gefunden werden';

     }

?>
Nun muss jede Zeichenkette die an die preg_match() Funktion übergeben wird mit den Zeichen "abc&qout; beginnen. Wendet man noch zusätzlich den Modifikator S an, also:
$pattern = '/^abc/s';
so muss jede Zeile der Zeichenkette mit "abc" beginnen.

$ Wie im einführenden Beispiel schon erwähnt, steht das Dollarzeichen für das Ende einer Zeichenkette.

<?php

$string = 'abcdef';
$pattern = '/f$/';

     if( preg_match($pattern,$string) ){

          echo 'Es wurde eine Übereinstimmung gefunden';

     }else{

          echo 'Es konnte keine Übereinstimmung gefunden werden';

     }

?>
Das Suchmuster trifft auf alle Zeichenketten zu, die ein f am Ende haben.

| Mit dem Vertikalen Strich kann man Alternativen festlegen.

Beispiel:

<?php

$string = 'abc';
$pattern = '/^abc|def$/';

     if( preg_match($pattern,$string) ){

          echo 'Es konnte eine Übereinstimmung gefunden werden';

     }else{

         echo 'Es konnte keine Übereinstimmung gefunden werden';

     }

?>
Das Suchmuster trifft auf alle Zeichenketten zu, die aus abc oder def bestehen.

() Die runden Klammern verwendet man um Bereiche des Patterns zu Gruppieren.

Beispiel:

<?php

$string = 'abcdefg';

$pattern = '/^abcdef(g|h)$/';

     if( preg_match($pattern,$string) ){

          echo 'Es wurde eine Übereinstimmung gefunden';

     }else{

          echo 'Es wurde keine Übereinstimmung gefunden';

     } ?>
So triff das Suchmuster auf die Zeichenketten abcdfg und abcdeh zu.

[] Mit dem eckigen Klammer können Zeichenklassen festgelegt werden. Zeichenklassen wurden bereist im ersten Beispiel eingesetzt.

Die geschweiften Klammern verwendet man dazu, die Anzahl der erlaubten Zeichen in einer Zeichenkette festzulegen.

Beispiel:

<?php

$postleitzahl = '10115';

$pattern = '/[0-9]{5}$/';

     if( preg_match($pattern,$postleitzahl) ){

          echo 'Die Postleitzahl hat das richtige Format';

     }else{

          echo 'Die Postleitzahl hat nicht das richtige Format';

     }

?>
In den Beispiel wird mit Hilfe der geschweiften Klammern geprüft, ob eine Deutsche Postleitzahl der Norm entspricht. Man wei&zslig; das Deutsche Postleitzahen nur aus 5 Ziffern bestehen und keine Sonderzeichen oder Buchstaben enthalten. Deswegen wird zuerst eine Zeichenklasse definiert, die besagt, dass die Zeichenkette auf der das Muster angewendet wird, nur aus Zahlen bestehen darf. In den geschweiften Klammern, kann man die minimale, maximale oder genaue Anzahl der Zeichen festlegen, die in einer Zeichenkette vorkommen darf.

Möchte man nicht, wie im Beispiel mit den Postleitzahlen, die exakte Anzahl an Zeichen festlegen, sondern festlegen wieviele Zeichen eine Zeichenkette mindestens haben muss, so kann man hinter die Zahl ein Komma setzten.

Beispiel:

<?php

$string = '123456';

$pattern = '/[0-9]{6,}/';

     if( preg_match($pattern,$string) ){

          echo 'Die Zeichenkette hat 6 oder mehr Zeichen';

     }else{

          echo 'Die Zeichenkette ist nicht lang genug';

     }

?>
Wird das Suchmuster auf eine Zeichenkette angewandt muss die Zeichenkette midestens 6 Zeichen enthalten.

Möchte man festlegen wie viele Zeichen eine Zeichenkette maximal haben darf, kann man nach dem Komma eine weiter Zahl angeben.

Beispiel:

<?php

$string = '123456';
$pattern = '/[0-9]{1,6}/';

     if( preg_match($pattern,$string){

          echo 'Die Zeichenkette ist lang genug';

     }else{

          echo 'Die Zeichenkette ist nicht lang genug';

     }

?>
Die Zeichenkette, auf die das Suchmuster angewendet wird, muss aus mindestens 1 und darf aus maximal 6 Zeichen bestehen.

Möchte man Metacharaktere als normale Zeichen in einem Suchmuster verwenden, so müssen diese mit einem Backslash maskiert werden.

Die geschweiften Klammern sind so genannte Qantifier. Durch diese die minimale, maximale oder genaue Anzahl angegeben, mit welcher ein Zeichen in der Zeichenkette vorkommen darf. * Das Sternzeichen steht für die Anzahl 0 oder mehr.

Beispiel:

<?php

$string = 'Ich bin ein String';
$pattern = '/.*/';

     if( preg_match($pattern.$string) ){

          echo 'Die Anzahl der Zeichen ist Korrekt';

     }else{

          echo 'Die Anzahl der Zeichen ist nicht Korrekt';

     }

?>
Das Suchmuster trifft auf alle, auch leere Zeichenketten zu.

+ Mit den Pluszeichen legt man fest, dass ein Zeichen mehr als nur einmal vorkommen darf.

Beispiel:

<?php

$string = 'abcdef';
$pattern = '/c+/';

     if( preg_match($pattern,$string) ){

          echo 'Es wurde eine Übereinstimmung gefunden';

     }else{

          echo 'Es wurde keine Übereinstimmung gefunden';

     }

?>
Die Zeichenkette im Beispiel muss mindestens ein c beinhalten.

Ein kleines Anwendungsbeispiel

Häufig werden reguläre Ausdrücke dazu eingesetzt, um zu Prüfen ob eine eingegebene E-Mail Adresse die richtige Syntax hat. Eine E-Mail Adresse kann aus Buchstaben, Ziffern, Unterstrichen,Punkten und Bindestrichen bestehen.

Beispiel:

<?php

$email = 'herrmustermann@domain.de';
$pattern = '/[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-])+@(0-9a-zA-Z-]*[0-9-a-zA-Z]\.)+([a-zA-Z]{2,4})/';

     if( preg_match($pattern,$email) ){

          echo 'Die E-Mail Adresse ist Korrekt';

     }else{

          echo 'Die E-Mail Adresse ist nicht Korrekt';

     }

?>