Sönke Tesch: Regulärer Ausdruck

Beitrag lesen

Völlig unnötig, was Du suchst, ist (wiedermal) nur zwei Klicks von der Startseite der PHP-Anleitung entfernt:

Kann gut sein, dass das für dich nur zwei klicks weg ist.

Mein Englisch ist ausserdem noch nicht gut genug (10. Klasse Gymnasium), als dass ich genug verstehen würde um nach der Anleitung von

Also die PHP-Anleitung gibt es (zu einem Teil) auch auf Deutsch und auf der Hauptseite ist sogar wortwörtlich "Reguläre Ausdrücke" aufgelistet. Ich bin mir ziemlich sicher, daß auch Du zumindest bis zur Funktion preg_match() mit wenigen Klicks findest, so fürchterlich schlecht dürfte Dein Englisch in der 10. nicht sein ;)

  • Das Muster muß in Schrägstriche eingebettet sein.
  • Möchtest Du, daß an einer Position im Muster nur ein bestimmtes Zeichen aus einer Auswahl zutrifft ("character class"), gibst Du diese Zeichen in eckigen Klammern ein ("square brackets"). Einen Bereich von zum Beispiel a bis z kannst Du mit Bindestrich abkürzen: a-z.
    Deine Auswahl ist also [a-z0-9_].
  • Soll ein Teil des Musters mehr als einmal vorkommen, kannst Du hinter diesem Teil die Anzahl der Wiederholungen angeben ("Repetition"). Das geht exakt über minimale und maximales Vorkommen mit geschweiften Klammern oder (häufiger), mit * (0 oder mehrmals), + (ein- oder mehrmals) und ? (0 oder einmal).
    Du möchtest sicher ein- oder mehrmals: +. Soll dein Text auch leer sein dürfen, nimm das Sternchen.
  • Es wird normalerweise nur verglichen, ob das angegebene Muster irgendwo im Text passt. Du kannst aber mit einem ^ am Anfang angeben, daß das Muster am Anfang des Textes passen muß und mit einem $ am Ende, daß dort das Ende des Textes sein muß. Damit das Muster auf den ganzen Text zutrifft, schreibst Du vorne ein ^ und hinten ein $.

Dein gesuchtes Konstrukt lautet dementsprechend

/[1]+$/

Also:
1. Außenrum die Schrägstriche.
(^ weiter unten)
2. Eine Auswahl an Zeichen, erkennbar an den eckigen Klammern, und zwar aus dem Bereich a bis z, 0 bis 9 sowie dem Unterstrich. Diese eckige Klammer stellt für sich nur ein Zeichen dar, es darf an dieser Stelle also nur wirklich ein Zeichen vorkommen.
3. Da in Deinem Text mehrere Zeichen vorkommen dürfen, setzt Du hinter die eckige Klammer ein +, d.h. der Inhalt der eckigen Klammer darf ein- oder mehrmals vorkommen.

Ohne ^ und $ würde dieses Muster auf jeden Text zutreffen, weil vor und hinter dem Muster beliebige Dinge erscheinen dürfen:

WQER_a9_QWFWQ

würde passen, weil hier in der Mitte ein _a9_ steht.

4. Damit der Bereich [a-z0-9_] gleich am Anfang des Textes stehen muß, kommt das ^ vornevor. Damit passt obiges Beispiel nicht mehr.

5. Da jetzt immernoch

_a9_QWFWQ

passt, kommt an's Ende ein $, d.h. nach dem Bereich [a-z0-9_] muß das Ende des Textes kommen.

Ich hoffe, das war halbwegs verständlich. Spiel ein bißchen mit dem Krams rum, mach ^ und/oder $ weg, ändere die Wiederholung oder den Inhalt der Zeichenklasse, so lernt man am Besten.
preg_match() kann mit zwei oder drei Argumenten aufgerufen werden. Wird ein drittes angegeben, schreibt preg_match() da die Textstelle rein, die auf das Muster passt. Damit kannst Du vergleichen, was genau passt, nicht nur das etwas passt:

echo preg_match("/[2]+$/","Ein langer Text der wegen der Großbuchstaben und des ß nicht passen wird",$match);
print_r($match);

Und guck unter den oben genannten englischen Stichwörtern in die Anleitung.

Gruß,
  soenk.e


  1. a-z0-9_ ↩︎

  2. a-z0-9_ ↩︎