# 6.4 Fortgeschrittene Sonderthemen

In diesem Abschnitt werden noch einige Sonderthemen behandelt. Diese wurden für Interessierte als – nicht prüfungsrelevant – ausgelagert, damit das Kapitel überschaubar bleibt.

## Maskieren von Sonderzeichen

Manchmal möchte man in einem String die Sonderzeichen maskieren. Hierzu dient die PHP-Funktion preg_quote.

Hier ein Beispiel für einen String mit Sonderzeichen (Zeile 2) und einer Maskierung mit `preg_quote()` (Zeile 3).

    1
    2
    3
    4
    <?php
    $textOriginal = `Er hatte die $-Zeichen in "den Augen"`;
    $textMaskiert = preg_quote($textOriginal);
    echo $textMaskiert;

Ausgabe:
Er hatte $-Zeichen in den \"Augen\"

Nur ohne Sonderzeichen bzw. mit maskierten Sonderzeichen kann dieser String mit einem regulären Ausdruck problemlos bearbeitet werden.

## Für Fortgeschrittene: Single-line-Mode

Der Single-line-Mode kann dafür verwendet werden, in HTML-Dateien vom Begin-Tag bis zum End-Tag alles zu bearbeiten, auch wenn der Tag über mehrere Zeilen geht.

Selbstverständlich können auch mehrzeilige Kommentare (C, Java) hiermit bearbeitet werden. In dem kleinen Beispiel sollen Kommentare gelöscht werden, die zwischen `/*` und `*/` über mehrere Zeilen gehen.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <?php
    $text = "
     //Auszug aus einer Klasse in einen String geschrieben
     //String wird so bearbeitet, dass jeweils Kommentare geloescht werden.

     /**
      * displays test
      */
     public function test()
     {
        echo('test');
     }
    ";

    print "Mit Kommentaren:<br>
        <pre>" . $text . "</pre>";

    $suchmuster = '/\/\*.*?\*\//s';
    $ersetzen = '';
    $neuerText = preg_replace($suchmuster, $ersetzen, $text);

    print "- - - <br>
        Ohne Kommentare:<br>
        <pre>" . $neuerText . "</pre>";
    ?>

Ausgabe mit Kommentaren

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    <?php
    //Auszug aus einer Klasse in einen String geschrieben
    //String wird so bearbeitet, dass jeweils Kommentare gelöscht werden.

    /**
     * displays test
     */
    public function test()
    {
       echo('test');
    }

Ausgabe ohne Kommentare

    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    //Auszug aus einer Klasse in einen String geschrieben
    //String wird so bearbeitet, dass jeweils Kommentare gelöscht werden.

    public function test()
    {
       echo('test');
    }

## Beispiel mod_rewrite für den Apache Webserver

Das Modul mod_rewrite kann verwendet werden, um URLs zu erkennen, umzuschreiben und weiterzuleiten – sowohl intern als auch extern. So findet man heute häufig sprechende URLs, die keine Dateinamen oder langen Parameterketten mehr enthalten. Für solche Zwecke wird dieses Modul häufig eingesetzt.

Sie haben bereits die .htaccess im Kapitel Apache kennengelernt. Mit Hilfe dieser Datei können wir nun nicht nur die verwendete Sprache verstecken, sondern auch die Seite ein wenig besser leserlich machen (SEO).

    RewriteEngine On
    RewriteBase /
    # der Inhalt nach dem ersten Slash wird als Seite bestimmt
    # weitere Parameter werden angehängt
    RewriteRule ^(.*)\/(.*)\/(.*)$ index.php?page=$1&id=$2&$3

Beispiel:
`http://www.abc.de/home/4/sid=123456`
leitet intern weiter auf:
`index.php?page=home&id=4&sid=123456`

Natürlich können Sie beliebig viele Regeln produzieren, die unterschiedlich viele Parameter verarbeiten. Es gilt allerdings dann auch festzulegen, dass nur eine passt.

Die Apache-Konfigurationsdatei wird von oben nach unten gelesen und jeder passende Ausdruck wird verwendet, es sei denn, Sie markieren diesen mit `[L]` für "last rule". Dies hat auch einen kleinen Geschwindigkeitsvorteil, da dann das Vergleichen der Strings abbricht.

Das Beispiel `http://www.abc.de/home/4/sid=123456` passt auf die folgenden regulären Ausdrücke.

    RewriteRule ^home\/(.*)\/(.*)$ index.php?id=$1&$2 [L]
    RewriteRule ^(.*)\/(.*)\/(.*)$ alle.php?page=$1&id=$2&$3

Um dieses nun zu verhindern, hängen Sie ein `[L]` für "last rule" an.

    RewriteRule ^home\/(.*)\/(.*)$ index.php?id=$1&$2 [L]
    RewriteRule ^(.*)\/(.*)\/(.*)$ alle.php?page=$1&id=$2&$3

## Finite Automaten und Reguläre Ausdrücke

Es gibt drei Varianten für Werkzeuge, die reguläre Ausdrücke bearbeiten können:

- DFA: Deterministischer finiter Automat
  Der DFA betrachtet Zeichen für Zeichen und kann intern keine Suchtreffer speichern. Somit kann DFA nicht „suchen und ersetzen“, da die Treffer nicht zwischengespeichert wurden.

- NFA: Nicht-deterministischer finiter Automat
  Der NFA basiert auf Backtracking und merkt sich alle Stellen, wenn mehr als eine Treffermöglichkeit existiert. Anschließend werden alle Treffermöglichkeiten nacheinander bearbeitet. Somit können Muster wie `s/(Internet)(Programmierung)/$2 im $1/` erfolgreich umgesetzt werden.

- POSIX-NFA: als eine Abwandlung des NFA

Hinweis

Alle in dem gesamten Kapitel behandelten Regeln und Beispiele beruhen auf dem POSIX-NFA. Dieser wird in PHP (wie auch in Perl) verwendet. Manchmal wird der Begriff POSIX-NFA in der Literatur verwendet und Sie können dann direkt an die hier beschriebenen Regeln und Beispiele denken.