Laden...

URL mit RegEx prüfen

Erstellt von Fabian vor 18 Jahren Letzter Beitrag vor 18 Jahren 8.106 Views
Fabian Themenstarter:in
1.985 Beiträge seit 2004
vor 18 Jahren
URL mit RegEx prüfen

Nabend Forum,

ich habe mal wieder ein RegEx Problem.

Ich würde gerne eine URL validieren und habe da jetzt noch so einige Fehler drin, die ich nicht beseitigt bekomme:

Folgenden RegEx habe ich zurzeit:


(http://|ftp://)?(www\.)?([a-zA-Z]+)\.([a-z]{2,4})$

Als Anfang funktioniert das auch schon soweit ganz gut. Probleme habe ich jetzt noch damit, dass "http" und "ftp" am Anfang des Strings stehen müssen, falls sie vorhanden sind und wenn das nicht so ist, kein match erfolgt. Genau das gleiche mit "www".

Die Tatsache, dass nicht auf alle möglichen Zeichen geprüft wird, würde ich jetzt gerne außen vor lassen. Das kann ich später noch einbauen. Mir geht es jetzt erstmal um den "allgemeinen" Syntax.

Vielleicht kann mir ja jemand helfen.

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Fabian,

für solche Aufgaben gibt es sicher sehr ausgefeilte REs im Netz.

Das www ist nicht nur optional, sondern es kann stattdessen ein beliebiger Name (Bezeichner stehen).

Durch (http://|ftp://)? ist die Protokollangabe schon optional. Das sollte also funktionieren, auch wenn ich eher ((http|ftp)://)? schreiben würde.

Stringanfang geht mit ^.

herbivore

Fabian Themenstarter:in
1.985 Beiträge seit 2004
vor 18 Jahren

Hallo herbivore,

danke für Deine Antwort!

Das es mit Sicherheit eine Menge RegEx zur Validierung einer URL im Netz gibt, kann ich mir gut vorstellen 🙂. Mir geht es aber erstmal um eine sehr einfache Version, damit auch der Lerneffekt dabei ist. Das ich dabei Möglichkeiten einer URL ausschließe, ist mir bewusst, aber für den Moment nicht schlimm.

Ich habe den RegEx jetzt folgendermaßen umgebaut und das Ergebnis ist für mich eigentlich schon ausreichend:

^((http|https|ftp)://)?([a-zA-Z0-9]+\.)?([a-zA-Z]+)\.([a-z]{2,4})$

Kannst Du beim Überfliegen vielleicht einen groben Schnitzer feststellen? Im Moment prüfe ich ja nur eine TLD, also ohne optionales .../verzeichnis/verzeichnis2/datei.endung?parameter etc.

Wie ich das evtl. noch einbaue, weiß ich nocht nicht 🙂.

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Fabian,

ich sehe beim Überfliegen keine Schnitzer.

Den Patttern für Domainnamen kann man allerdings noch verbessern:

Eine gültige Domain darf nur aus Zahlen, den Buchstaben A-Z, dem Zeichen "-" (Bindestrich) und den weiteren Buchstaben bestehen, die in der Anlage zu den Domainrichtlinien aufgeführt sind. Die Domain muss mindestens einen Buchstaben enthalten (ansonsten wäre eine Verwechslung mit den rein numerischen IP-Adressen möglich). Bindestriche sind nicht erlaubt an der ersten und letzten Stelle, sowie gleichzeitig an der dritten und vierten Stelle (z. B. xn--.de). Zwischen Groß- und Kleinschreibung wird nicht unterschieden. Die Mindestlänge einer .de-Domain beträgt drei Zeichen, die Höchstlänge 63 Zeichen (vergleiche RFC1035). Sofern die Domain Buchstaben aus der Anlage der Domainrichtlinien enthält, ist für die Höchstlänge die gemäß dem RFC3490 in der sogenannten ACE-Form kodierte Fassung der Domain maßgebend.

herbivore

Fabian Themenstarter:in
1.985 Beiträge seit 2004
vor 18 Jahren

Nabend herbivore,

danke für Deine Antwort und Mühe. Zwei Probleme habe ich aber noch, die ich nicht in den Griff bekomme. Im Moment sieht mein RegEx so aus:

^((http|https|ftp)://)?([a-zA-Z0-9]+\.)?([a-zA-Z]+)(\.([a-z]{2,4}))+$

Das erste Problem ist, dass der RegEx auch auf "www.heis" matched, obwohl da ja noch beispielsweise ein ".de" fehlt. Warum er das matched, ist mir eigentlich bewusst, weil er das .heis als Endung ansieht, aber wie ich das lösen kann, weiß ich leider nicht.

Das zweite Problem ist noch unlösbarer für mich 🙂:

Ich würde den RegEx gerne so erweitern, dass er auch am Ende mit .../verzeichnis/datei.endung?parameter1=value1 etc. klar kommt. Das ich dafür nur einige Sonderzeichen mit einbauen muss, weiß ich (bzw. ich hoffe, dass das so stimmt), aber ich komme leider nicht da hinter, wie ich das in den vorhandenen RegEx einbaue.

Vielleicht hast Du ja noch mal die Lust und Zeit, mir zu helfen.

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Fabian,

zu 1. auf www.heis sollte er aber nur matchen, wenn danach nichts mehr folgt, denn durch das $ liest er ja bis zum Ende der Zeile/des String. Lustigerweise erkennt das auch der Forumsparser als gültig.

Ansonsten ist es ja eine syntaktische Überprüfung und keine semantische. Syntaktisch ist www.heis eine gültige Web-Adresse. Erst sematisch wird klar, dass heis keine gültige TLD ist.

zu 2. Kommt drauf an, was du willst. Am einfachsten ist sicher:

Vor dem $ deiner jetztigen Regex einsetzen: (/.*)?

herbivore

P
939 Beiträge seit 2003
vor 18 Jahren

Vielleicht holst du dir doch ein paar Anregungen aus dem Netz.

Ich hab mal auf www.regxlib.com nach URL-Patterns gesucht:
http://www.regxlib.com/Search.aspx?k=url

"(http|https|ftp)://" hab ich dort so gesehen: "(ht|f)tp(s?)://". (Naja, sind nicht ganz identisch).

In den Beiträgen zu den Patterns wird gepostet, welche Fälle nicht beachtet werden.

Gruss
Pulpapex

Fabian Themenstarter:in
1.985 Beiträge seit 2004
vor 18 Jahren

Hallo ihr beiden,

danke für die Hinweise und Links. Das sollte mir erstmal weiterhelfen. Und das eine Angabe in Form von www.heis syntaktisch ok ist, semantisch aber nicht, ist jetzt auch klar!

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

Fabian Themenstarter:in
1.985 Beiträge seit 2004
vor 18 Jahren

Hallo,

so, ich muss Euch jetzt doch mal noch nerven:

Folgendermaßen habe ich jetzt meinen RegEx erweitert:

^((http|https|ftp|news)://)?([a-zA-Z0-9]+\.)?([a-zA-Z]+)(\.([a-z]{2,4}))+([\w-\.,@?^=%&:/~\+#]*[\w-\@?^=%&/~\+#])?$

Dadurch werden jetzt auch URLs im Format www.heise.de/index.html?parameter1=value1&parameter2=value2 gematched.

Das Problem, dass dabei entsteht und ich nicht lösen kann, ist, dass jetzt auch URLs alá www.heise erkannt werden. Das möchte ich eigentlich verhindert, da ich nur Endungen mit 2-4 Zeichen erlauben will. Allerdings wird das durch das letzte Pattern, das ich hinzugefügt habe, ausgehebelt (ohne das Pattern funktioniert es nämlich).

Hat jemand eine Ahnung, wie ich das wieder hinbekommen kann?

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Fabian,

verlange in dem optionalen Teil nach der TLD einfach, dass das erste Zeichen ein Schrägstrich sein muss.

herbivore

_
416 Beiträge seit 2005
vor 18 Jahren

Original von herbivore
verlange in dem optionalen Teil nach der TLD einfach, dass das erste Zeichen ein Schrägstrich sein muss.

... oder ein Fragezeichen 🙂

Übrigens gibts auch TLDs mit mehr als 4 Zeichen. Laut Wikipedia z.B. .travel oder .museum. Ok, begegnet sind die mir noch nicht, aber vl werden die ja in Zukunft häufiger auftreten.

Vl. wäre daher eher ein solches TLD-Regex angebracht: ([a-zA-Z]{2}|com|org|...alle nicht Länder-TLDs) Damit müsstest du zwar jedes mal wenn eine neue TLD eingeführt wird dein REGEX erweitern, aber besser als wenn www.heis als URL erkannt wird.

cu, tb

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo tb,

meinst du damit, dass z.B. http://www.heise.de?irgendwas eine gültige (wohlgeformte) URL wäre?

herbivore

Fabian Themenstarter:in
1.985 Beiträge seit 2004
vor 18 Jahren

Original von tb

... aber besser als wenn
>
als URL erkannt wird.

cu, tb

Hallo tb,

also das www.heis erkannt wird, finde ich nicht schlimm. Woher soll der RegEx denn auch wissen, dass wir mit 123.com eine gültige Adresse meinen, mit www.heis aber nicht? Passt für ihn beides in den RegEx und damit ist es syntaktisch in Ordnung.

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

Fabian Themenstarter:in
1.985 Beiträge seit 2004
vor 18 Jahren

Original von herbivore
Hallo Fabian,

verlange in dem optionalen Teil nach der TLD einfach, dass das erste Zeichen ein Schrägstrich sein muss.

herbivore

Hallo herbivore,

hmm, ich steh da grad auf dem Schlauch. Der Optionale Teil nach der TLD ist für mich:

(/[\w-\.,@?^=%&:~\+#]*[\w-\@?^=%&/~\+#])?$

Davor habe ich alles beim alten gelassen. Wenn ich das so ändere, matched er nicht mehr auf "www.heise", weil mehr als 4 Buchstaben nach dem Punkt sind. Er matched dadurch aber leider auch nicht mehr "www.heise.de/verzeichnis1/verzeichnis2" etc.

Ich kriegs grad einfach nicht hin 😦.

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

_
416 Beiträge seit 2005
vor 18 Jahren

Original von herbivore
meinst du damit, dass z.B.
>
eine gültige (wohlgeformte) URL wäre?

Ja meine ich. Da alles hinter einem ? als Parameter interpretiert wird. Und wenn z.B. eine index.php in den Root-ordner gelegt wird, würde das schon sinn machen.
[EDIT] Natürlich müsste es dann: "www.heise.de?igendwas=irgendwas_andres" heißen. Na egal, tritt wahrscheinlich eh nie auf [/EDIT]
@Fabian:
Ok wenns nicht schlimm ist, ist ja gut. Mein eigentlicher Punkt war auch dass auch es auch 6-Zeichen TLDs gibt und damit das {2,4} nicht ausreicht um alle Adressen zu erkennen.

cu, tb

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo tb,

also http://www.heise.de/?irgendwas würde ich verstehen, aber http://www.heise.de?irgendwas kommt mir irgendwie komisch vor, zumal http://www.heise.de eh nur eine Abkürzung ist, die in http://www.heise.de/ umgesetzt wird.

Hallo Fabian,

Davor habe ich alles beim alten gelassen.

So habe ich es gemeint!

Wenn ich das so ändere, matched er nicht mehr auf "www.heise", weil mehr als 4 Buchstaben nach dem Punkt sind.

Was ja auch beabsichtigt war.

Er matched dadurch aber leider auch nicht mehr "www.heise.de/verzeichnis1/verzeichnis2" etc.

Sollte er aber! Ich sehe jedenfalls auf die Schnelle nichts.

herbivore

Fabian Themenstarter:in
1.985 Beiträge seit 2004
vor 18 Jahren

Hallo tb,

mit den 6-Zeichen TLDs hast Du schon Recht. Ich werde das Pattern auf {2,6} ändern, um da sicher zu gehen.

Hallo herbivore,

komisch. Ich merke grad, das er www.heise.de/verzeichnis/ noch matched, aber sobald hinter dem letzten / noch ein Zeichen kommt, wird nicht mehr gematched. Ich kanns mir nicht erklären.

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

_
416 Beiträge seit 2005
vor 18 Jahren

So, hab jetzt noch mal in "Mastering Regular Expressions" (≤= kann ich nur empfehlen) nachgeschaut. Dort wird eine URL so gematcht

   # Capture the URL to $1 . . . 
   (
      http:// [-a-z0-9]+(\.[-a-z0-9]+)*\.([a-z][a-z]|com|edu|info) \b # hostname
      (
         / [-a-z0-9_:\@&?=+,.!/~*'%\$]*  # optional path
      )?
   )
 

(Ist durch die o.g. Werbung eigentlich auch das Zitieren erlaubt?)

der Autor erwähnt bei den TLDs auch dass es eigentlich eine Auflistung aller TLDs sein müsste. (Daher hatte ich das auch).

@herbivore
ok, hab nichts gesagt 8)

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Fabian,

ha, jetzt habe ich es gesehen. Dir fehlt ein + oder *.

herbivore

Fabian Themenstarter:in
1.985 Beiträge seit 2004
vor 18 Jahren

Hallo herbivore,

das hatte ich auch schon vermutet und ausprobiert, aber leider funktioniert es nicht 😦. Ich hab auch grad gemerkt, dass ein www.heise.de/ auch nicht matched. Dort matched er erst, wenn hinter dem / wieder ein Zeichen ist.

Hier noch mal der komplette RegEx, wie ich ihn zurzeit habe:

^((http|https|ftp|news)://)?([a-zA-Z0-9]+\.)?([a-zA-Z]+)(\.([a-z]{2,6}))+(/+[\w-\.,@?^=%&:~\+#]*[\w-\@?^=%&/~\+#])?$

Edit:
@alexander: Kannst Du nicht mal in den WBB2 Sources nachschauen, da der URL-Forums-Parser wohl all' das erkennt, was ich haben möchte 🙂.

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Fabian,

ich meinte ein Stern für die letzten eckigen Klammern. Ansonsten würde ich noch ein paar andere Umstellungen machen (ungetestet):

((http|https|ftp|news)://)?([a-zA-Z0-9-]+.)+[a-z]{2,6}(/[\w.,@?=%&:+#-]*[\w-@?^=%&/+#]*)?$

herbivore

Fabian Themenstarter:in
1.985 Beiträge seit 2004
vor 18 Jahren

Hallo herbivore,

danke für den RegEx.

Er machted jetzt auf www.heise.de/verzeichnis1/verzeichnis2/ etc. und lässt ein www.heiseee weg. Also genau so wie ich es haben wollte.

Bevor ich mich aber richtig freuen konnte, hab ich gemerkt, dass er jetzt Probleme mit einem Punkt in den Verzeichnissen hat. Also ein www.heise.de/verzeichnis1/index.html?parameter1=wert1 machted leider nicht mehr.

Es liegt auch nicht an den Sonderzeichen bei der Parameter- und Wertangabe, sondern nur an dem Punkt. Nimmt man den raus, matched er wieder.

Tut mir leid, dass ich nerve... aber ich verzweifel grad 😦.

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Fabian,

ich habe sowieso nicht verstanden, warum du [\w.,@?=%&:~+#-]*[\w-@?=%&/+#]* verwendest, wenn es nach mir geht, nimmst du stattdessen [\w.,@?^=%&:+#-]*

herbivore

Fabian Themenstarter:in
1.985 Beiträge seit 2004
vor 18 Jahren

Hallo herbivore,

jetzt bin ich zu folgendem Ergebnis gekommen:

^((http|https|ftp|news)://)?([a-zA-Z0-9]+\.)?([a-zA-Z]+)(\.([a-z]{2,6}))+(/[\w\.,@?=/^%&:~\+#-]*)?$

Das matched eigentlich so, wie ich es haben will. Was ich etwas unschön finde, ist, dass er auch auf zum Beispiel www.heise.de/index. matched, was ja glaube ich nicht gültig ist oder (obwohl der Forums-Parser es erkennt 🙂)?
Aber ich denke, ich höre an dieser Stelle auf, da ich ansonsten die Krise kriege 🙂. Außer jemand sieht noch etwas nicht so gutes oder hat noch eine Idee, dann immer her damit.

Danke und Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Fabian,

warum soll www.heise.de/index. ungültig sein? Insbesondere unter Linux (und viele Web-Server laufen unter Linux) ist 'index.' ein zulässiger und von 'index' verschiedener Dateiname.

herbivore

Fabian Themenstarter:in
1.985 Beiträge seit 2004
vor 18 Jahren

Hallo herbivore,

stimmt, da habe ich überhaupt nicht dran gedacht! Dann scheine ich ja den Ausdruck zu haben, den ich suchte. Werde ich zwar noch ein bissle mit testen, aber sieht doch ganz gut aus.

Danke vielmals!

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de