Einen Hostnamen auf syntaktische Korrektheit prüfen

(Auszug aus "Reguläre Ausdrücke" von Jeffrey E. F. Friedl)

Im vorherigen Beispiel hatten wir für den Servernamen nur ˹[^/:]+˼ verwendet, unter Erweiterte einführende Beispiele (siehe unter Eine Regex-Sammlung) dagegen das kompliziertere ˹[-a-z]+(\.[-a-z]+)*\.(com|edu|...|info)˼. Warum betreiben wir einen derart unterschiedlichen Aufwand für das gleiche Resultat?

Nun, beide Unterausdrücke »passen auf einen Hostnamen«, aber in ganz verschiedenem Zusammenhang. Aus einem String mit bekanntem Aufbau einen Teil herauszupicken ist relativ einfach (wenn wir beispielsweise wissen, dass es sich um eine URL handelt), es ist aber ungleich schwieriger, sicher und eindeutig den gleichen Teil in einem beliebigen String zu identifizieren.

Im vorherigen Beispiel haben wir angenommen, dass nach einem ›http://‹ ein Hostname kommt, da war das einfache ˹[^/:]+˼ angemessen. Im Beispiel aus Erweiterte einführende Beispiele dagegen mussten wir eine Regex entwickeln, die in einem beliebigen Text die Hostnamen erkennt. Darum mussten wir schon spezifischer vorgehen.

Nun wollen wir aber ein drittes Mal und diesmal ganz exakt mit einem regulären Ausdruck prüfen, ob ein wohlgeformter, syntaktisch korrekter Hostname vorliegt. Offiziell besteht ein Internet-Hostname aus mehreren Teilen, die durch Punkte voneinander getrennt sind. Jeder Teil besteht aus ASCII-Buchstaben, -Ziffern und dem Bindestrich. Der Bindestrich darf jedoch weder das erste noch das letzte Zeichen sein. Einen Hostname-Teil können wir also (wir ignorieren Groß- und Kleinschreibung) mit ˹[a-z0-9]|[a-z0-9][-a-z0-9]*[a-z0-9]˼ erkennen. Für den letzten Teil (›com‹, ›edu‹, ›de‹ usw.) gibt es nur eine eingeschränkte Anzahl von Möglichkeiten, wie nebenher unter Erweiterte einführende Beispiele erwähnt wurde. Damit bekommen wir den folgenden regulären Ausdruck für einen syntaktisch korrekten Hostnamen:

^
  (?i)  # Groß- und Kleinschreibung nicht beachten.
  # Ein oder mehrere Teile, durch Punkte getrennt ...
  (?: [a-z0-9]\. | [a-z0-9][-a-z0-9]*[a-z0-9]\. )+
  # Top-level-Domains ...
  (?: com|edu|gov|int|mil|net|org|biz|info|name|museum|coop|aero|[a-z][a-z] )
$

Was auf diese Regex passt, muss noch nicht unbedingt korrekt sein. Es gibt auch ein Längenlimit für die einzelnen Teile. Diese dürfen nicht länger als 63 Zeichen sein. Wir ersetzen dazu den Stern in ˹[-a-z0-9]*˼ durch {0,61}.

Wenn es ganz offiziell sein soll, müssen wir noch etwas berücksichtigen. Auch ein Name, der nur aus dem obersten Domainnamen besteht (also ›com‹, ›edu‹ usw.), ist an sich syntaktisch korrekt. In der Praxis gibt es solche Rechner für die »Namen«-Domains aber nicht, nur bei manchen zweibuchstabigen Länder-Domains antwortet ein Rechner. Anguilla hat beispielsweise einen Webserver mit der Adresse "http://ai/", auch bei den Domains cc, co, dk, mm, ph, tj, tv und tw findet man einen Webserver.

Wenn wir auch das zulassen wollen, ersetzen wir den Plus-Quantor beim mittleren Teil ˹(?:...)+˼ durch ˹(?:...)*˼, und wir erhalten:

^
  (?i)  # Groß- und Kleinschreibung nicht beachten.
  # Ein oder mehrere Teile, durch Punkte getrennt ...
  (?: [a-z0-9]\. | [a-z0-9][-a-z0-9]{0,61}[a-z0-9]\. )*
  # Top-level-Domains ...
  (?: com|edu|gov|int|mil|net|org|biz|info|name|museum|coop|aero|[a-z][a-z] )
$

Das funktioniert nun erstklassig bei einem String, der nur aus einem Hostnamen besteht. Da dieses der genaueste unserer drei Hostnamen-Ausdrücke ist, könnten wir versucht sein, auch die Anker vorn und hinten wegzulassen. So ist das ganz und gar nicht. Diese Regex passt auf jedes zweibuchstabige Wort: In dieser Hinsicht ist sogar die weniger spezifische Regex aus Erweiterte einführende Beispiele besser. Je nach Kontext und Verwendungszweck ist dieser reguläre Ausdruck aber noch nicht gut genug.

  

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema Reguläre Ausdrücke bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:
   

Copyright der deutschen Ausgabe © 2008 by O’Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "Reguläre Ausdrücke" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

O’Reilly Verlag GmbH & Co. KG, Balthasarstr. 81, 50670 Köln