# 6.1 PHP-Funktionen für reguläre Ausdrücke und triviale Beispiele

Das Zusammenspiel von regulären Ausdrücken und PHP soll an sehr einfachen Beispielen gezeigt werden. Wir konzentrieren uns auf die Verwendung der PHP-Funktionen preg_match(), preg_match_all() und preg_replace().

PHP-Funktionen für Reguläre Ausdrücke | Beschreibung
--- | ---
`preg_match()` | Speichert den ersten Eintrag und gibt 1 zurück wenn etwas gefunden wurde. `preg_match($suchmuster,$text)`
`preg_match_all()` | Speichert alle Strings, die auf das gesuchte Muster passen und gibt die Anzahl der Treffer zurück. `preg_match_all($suchmuster,$text,$treffer)`
`preg_replace()` | Suchen und Ersetzen von Strings mit einem regulären Ausdruck. `preg_replace($suchmuster,$ersetzen,$text)`

Es gibt noch eine Reihe weiterer Funktionen für reguläre Ausdrücke, auf die wir aber nicht weiter eingehen. Hier eine Auswahl daraus:

- preg_filter() — Suchen und ersetzen. Funktioniert ähnlich wie preg_replace()
- preg_grep() — Liefert alle Elemente, die auf ein Suchmuster passen. Als Eingabe dient ein Array (anstelle eines einfachen Strings).
- preg_quote() — Maskiert Zeichen regulärer Ausdrücke, indem ein Backslash vor jedes Zeichen der durchsuchenden Zeichenkette gesetzt wird. Das ist sinnvoll, wenn ein Text Sonderzeichen enthält.
- preg_split() — Zerlegt eine Zeichenkette anhand eines regulären Ausdrucks.

Hinweis

Wir verwenden für PHP die PCRE-Befehle (Perl Compatible Regular Expressions). Wer schon in Perl mit regulären Ausdrücken gearbeitet hat, der kann diese so in PHP übernehmen. Weitere Informationen hierzu gibt es unter http://php.net/manual/de/book.pcre.php.

## Einfaches Beispiel für preg_match()

Schauen Sie sich diese Beispiele für die Verwendung der regulären Ausdrücke in PHP genau an. Sie werden diese oft brauchen.

Zuerst ein Beispiel für eine einfache Suche mit preg_match() und eine if-Abfrage, ob das Suchmuster in einem Textstring vorkommt.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    $text = "PHP macht viel Spaß";
    $suchmuster = '/viel/';
    if(preg_match ($suchmuster, $text, $treffer)) {
        print_r($treffer);
    }else{
        print "Kein Treffer";
    }
    ?>

Ausgabe:
Array([0] => viel

Zurückgegeben wird ein Array mit einem Element. Die Ausgabe in $treffer lautet: `Array([0] => viel`). In der 4. Zeile sehen Sie, dass die PHP-Funktion `preg_match()` direkt in der if-Abfrage steht. Also Achtung: die Funktion `preg_match()` selbst gibt nur 1 (=Treffer) oder FALSE (=kein Treffer) zurück.

`preg_match()` erwartet als Parameter `$suchmuster` und `$text`. Die Variable `$treffer` ist optional. Auch sind bei allen preg-Funktionen weitere Parameter (z.B. für einen Offset) möglich.

## Einfaches Beispiel für preg_match_all()

Manchmal möchte man wissen, wie oft etwas vorkommt. Hierzu kann man preg_match_all() gut verwenden.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    $text = "PHP macht viel Spaß";
    $suchmuster = '/a/';
    if(preg_match_all($suchmuster, $text, $treffer)) {
        print_r($treffer);
    }else{
        print "Kein Treffer";
    }
    ?>

Ausgabe:
Array ([0] => Array([0]=>a [1]=>a))

Zurückgegeben wird ein Array mit allen Treffern. Die Ausgabe in $treffer lautet: `Array ([0] => Array([0]=>a [1]=>a))`. Die Anzahl der Vorkommnisse kann gezählt werden.

`preg_match_all()` erwartet als Parameter `$suchmuster`, `$text` und `$treffer`. Seit PHP 5.4 ist `$treffer` optional. Weitere Parameter (z.B. für einen Offset) sind möglich.

## Einfaches Beispiel für preg_replace()

Sehr häufig soll ein Ausdruck durch einen anderen ersetzt werden. Das ist die Aufgabe von preg_replace().

    1
    2
    3
    4
    5
    6
    7
    <?php
    $text = "PHP macht viel Spass";
    $suchmuster = '/ viel /';
    $ersetzen = 'mir';
    $neuerText = preg_replace($suchmuster, $ersetzen, $text);
    print $neuerText;
    ?>

Ausgabe:
PHP macht mir Spass

Zurückgegeben wird ein String. Die Ausgabe in `$neuerText` lautet: `PHP macht mir Spass`.

In der 5. Zeile sehen Sie, dass die PHP-Funktion `preg_replace()` anders funktioniert, denn dort wird das Ergebnis in einer Variablen `$neuerText` gespeichert.

preg_replace() ist aber noch mächtiger, als in dem trivialen Beispiel angegeben. Denn `preg_replace()` findet ohne Limitierung alle Treffer und ersetzt diese, wenn das Limit nicht explizit angegeben wird.

### Alle Treffer löschen

Hier suchen wir nach dem Buchstaben `a` und löschen diesen, indem wir in `$ersetzen` einen leeren String schreiben.

    1
    2
    3
    4
    5
    6
    7
    <?php
    $text = "PHP macht viel Spass";
    $suchmuster = '/a/';
    $ersetzen = '';
    $neuerText = preg_replace($suchmuster, $ersetzen, $text);
    print $neuerText;
    ?>

Ausgabe:
PHP mcht viel Spss

### Genau zwei Treffer löschen mit `$limit = 2`

Wenn wir eine feste Anzahl von Treffern ersetzen möchten, dann kann dies in `preg_replace()` mit angegeben werden. Wir führen hierfür die Variable `$limit` ein.

    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    $text = "Regen, Regen, nichts als Regen";
    $suchmuster = '/Regen/';
    $ersetzen = 'Schnee';
    $limit = 2;
    $neuerText = preg_replace($suchmuster, $ersetzen, $text, $limit);
    print $neuerText;
    ?>

Ausgabe:
Schnee, Schnee, nichts als Regen

In der 5. Zeile haben wir `$limit = 2` gesetzt, sodass nur die ersten beiden Treffer ersetzt wurden. Mit `$limit = -1` (Default-Einstellung) werden alle Treffer gefunden und ersetzt.

Hinweis

Auch eine Kurzschreibweise ohne Variablen ist möglich, in der wir die Strings direkt einsetzen:

    $neuerText = preg_replace("/H/", "M", "Haus<Auto");

## Reguläre Ausdrücke im Web-Interface prüfen

Es gibt eine Reihe von Webseiten zum Testen regulärer Ausdrücke. Achtung: unterschiedliche Programmiersprachen haben eventuell eine (leicht) unterschiedliche Syntax der regulären Ausdrücke. Wie die externen Tools genau arbeiten ist mir nicht bekannt.

- http://www.regexe.de/
- http://gskinner.com/RegExr/ - Sehr schön, aber nicht PHP-basiert. Also bei komplexen regulären Ausdrücken die Ergebnisse vor der Übernahme in PHP kritisch hinterfragen. Für die hier im Modul verwendeten regulären Ausdrücke sollte es keine Abweichungen geben.