6.2.3 Joker-Zeichen und Gier

Wenn man einen beliebigen Text mit beliebiger Länge überprüfen möchte, dann sind die Joker-Zeichen (auch Quantoren) wichtig.

Zeichen Erklärung
. Der „Punkt“ steht für ein beliebiges Zeichen (Ausnahme: Zeilenumbruch Newline).
? Das vorstehende Zeichen 0 oder 1-mal.
+ Das vorstehende Zeichen 1-mal oder beliebig oft.
* Das vorstehende Zeichen 0-mal oder beliebig oft.

Text: Hier teste ich 1000 Texte
Suchmuster: /.+1000/
Ergebnis: Hier teste ich 1000 Texte
Hier wirkt .+ wie ein „Gummiband“, das so lange gedehnt wird, bis ein maximaler Treffer möglich ist.

Text: Hier teste ich 1000 Texte
Suchmuster: /[A-Z]?(ich)+/
Ergebnis: Hier teste ich 1000 Texte

Da vor dem festen Suchausdruck ich kein Großbuchstabe steht (sondern ein Leerzeichen), wirkt sich das ? mit der Option „0-mal treffen“ aus.

Gefräßigkeit (auch: Gier, greed, greedy)

Gieriger Operator (oder alternativ Gefräßiger Operator)
„Gier“ (eng. greed) bedeutet, dass bei der Verwendung von + und * der gesamte Suchstring erst abgearbeitet wird und dann von hinten das letzte passende Ergebnis genommen wird.

Text: vorname; name; strasse; ort
Suchmuster: / .*; /
Ergebnis: vorname; name; strasse; ort
Hier wirkt .* wie ein „Gummiband“, das so lange gedehnt wird, bis ein maximaler Treffer möglich ist.

Nicht-gieriger Operator
Man kann die gierigen Operatoren in „nicht-gierig“ verwandeln, indem ein ? nachgestellt wird. Dann wird die kürzeste Zeichenkette gefunden. Dies wird sehr häufig verwendet (weil es normalerweise sehr sinnvoll ist).

Text: vorname; name; strasse; ort
Suchmuster: /.*?;/
Ergebnis: vorname; name; strasse; ort
Hier wirkt .*? wie ein „Gummiband“, das nur so lange gedehnt wird, bis ein erster, minimaler Treffer möglich ist.

Die Joker-Zeichen sind normalerweise nur sinnvoll in Kombination mit anderen (festen) Suchbegriffen. In den oben gezeigten Beispielen stellt das Semikolon ; ein solches „festes Zeichen“ dar, an dem sich die Joker-Zeichen als „Gummiband“ orientieren.

3. Regel: Joker-Zeichen sollten möglichst „vorn“ und „hinten“ von „festen Suchbegriffen“ eingegrenzt werden.

Hinweis

Die unkontrollierte Verwendung von .* oder .+ ist ein typischer Anfängerfehler.

Markierung von Anfang und Ende

Wenn wir eine Postleitzahl suchen, dann ist '26237' ein gültiger Treffer mit 5 Ziffern. Aber 'a26237' wäre kein gültiger Treffer. Wir müssen also sichergehen können, dass keine Zeichen vor oder hinter einem Treffer sind. Somit suchen wir in einem String oder einer Zeile vom Anfang bis zum Ende.

Der Anfang eines Textes kann gefunden werden mit ^ und das Ende mit $.

Text: vorname; name; strasse; ort
Suchmuster: /^.*?$/
Ergebnis: vorname; name; strasse; ort
Dieses Suchmuster findet grundsätzlich alles von Anfang bis Ende.

Suchmuster: /^\s*$/ findet Leerzeilen.

Suchmuster: /^#.*$/ findet alle einzeilige Kommentarzeilen. Mit diesem Suchmuster lassen sich beispielsweise alle Kommentare einer Apache-Konfigurationsdatei löschen.

Aufgabe

Erstellen Sie eine PHP-Datei, die eine Apache-Konfigurationsdatei einliest und die Kommentarzeilen aus der Datei löscht. Schreiben Sie das Ergebnis in eine neue Datei.

Hinweis

Alternativ zur Markierung des Textanfangs mit ^ gibt es \A und alternativ zu $ gibt es \z bzw. \Z.