Aufsplitten einer URL
SebastianJu
- webhosting
0 Beat0 suit- programmiertechnik
0 SebastianJu0 MudGuard0 suit
0 Tim Tepaße
0 hotti0 GrandmasterA
Ich bin gerade dabei ein einfaches Skript zu schreiben mit dem jede art von URL in seine Bestandteile zerlegt werden können soll. Dabei setze ich auf das Vorhandensein von bestimmten Zeichen in der URL um das tun zu können. Könnt ihr mal Kritik üben wenn eine meiner Annahmen falsch ist?
Also von vorn angefangen kommt das Protokoll wenn angegeben. Identifizierbar durch das Vorkommen von "://" in der URL. Diese Kombination wird wohl nur einmal vorkommen können. Alles davor ist Protokollname.
Dann kommen mögliche Subdomains zu denen auch www gehört. Von "://" bis zum Topleveldomain sollte es keinen weiteren "/" geben. Das heißt alles dazwischen muss Domain und Subdomain sein. Von rechts angefangen auszuwerten braucht man nur die "." abgehen. Als erste kommt die TLD ("org"), dann die Domainbezeichnung ("selfhtml"), danach nur noch Subdomains.
Jetzt geht es um die Pfade. Man kann sich von "/" zu "/" hangeln und dadurch einen Pfad nach dem anderen einlesen. Sobald ein "." zwischen den "/" liegt wird es vermutlich der Dateiname mit Erweiterung sein. Obwohl ich mir nicht sicher bin dass es nicht doch sein könnte dass ein Verzeichnis einen "." enthält. Wenn man dann bei der Datei ist kann man Dateiname und Erweiterung ablesen. Sofern natürlich ein Dateiname angegeben wurde.
Kommt danach ein "?" gibt es GET-Parameter die immer getrennt sind durch "&". Und Variable und Wert sind getrennt durch "=".
Es kann aber auch sein dass nach dem Dateinamen noch ein "/" kommt und irgendwelche Zeichen. Wie man das nennt weiß ich nicht. Kann man auf dem Server auswerten diese Daten. Das dürfte dann aber nur unter Angabe eines Dateinamens funktionieren nehme ich an.
Kann ich das so benutzen oder habe ich etwas als gegeben angesehen was nicht der Fall ist?
Danke!
Sebastian
Ich bin gerade dabei ein einfaches Skript zu schreiben mit dem jede art von URL in seine Bestandteile zerlegt werden können soll. Dabei setze ich auf das Vorhandensein von bestimmten Zeichen in der URL um das tun zu können. Könnt ihr mal Kritik üben wenn eine meiner Annahmen falsch ist?
Also von vorn angefangen kommt das Protokoll wenn angegeben. Identifizierbar durch das Vorkommen von "://" in der URL. Diese Kombination wird wohl nur einmal vorkommen können. Alles davor ist Protokollname.
Ein schema ist bestehend aus [a-z]+:
// leitet bereits den Authority-Part ein, der aber ja nach schema gestaltet ist.
Du musst also expliziter werden welche schema URIs du erfassen willst.
Dann kommen mögliche Subdomains zu denen auch www gehört. Von "://" bis zum Topleveldomain sollte es keinen weiteren "/" geben. Das heißt alles dazwischen muss Domain und Subdomain sein. Von rechts angefangen auszuwerten braucht man nur die "." abgehen. Als erste kommt die TLD ("org"), dann die Domainbezeichnung ("selfhtml"), danach nur noch Subdomains.
Jetzt geht es um die Pfade. Man kann sich von "/" zu "/" hangeln und dadurch einen Pfad nach dem anderen einlesen. Sobald ein "." zwischen den "/" liegt wird es vermutlich der Dateiname mit Erweiterung sein. Obwohl ich mir nicht sicher bin dass es nicht doch sein könnte dass ein Verzeichnis einen "." enthält. Wenn man dann bei der Datei ist kann man Dateiname und Erweiterung ablesen. Sofern natürlich ein Dateiname angegeben wurde.
Kommt danach ein "?" gibt es GET-Parameter die immer getrennt sind durch "&". Und Variable und Wert sind getrennt durch "=".
Ein ? leitet den Query-String ein. Dessen interne Struktur braucht dich nicht zu interessieren.
Es kann aber auch sein dass nach dem Dateinamen noch ein "/" kommt und irgendwelche Zeichen.
Der schluss auf eine Datei in einer URI ist gewagt. Welcher Teil einer URI auf eine Ressource zutrifft, weiss nur der behandelnde Server.
Kann ich das so benutzen oder habe ich etwas als gegeben angesehen was nicht der Fall ist?
Die Frage ist eher, warum du einen URI zerlegen musst.
mfg Beat
Also von vorn angefangen kommt das Protokoll wenn angegeben. Identifizierbar durch das Vorkommen von "://" in der URL. Diese Kombination wird wohl nur einmal vorkommen können. Alles davor ist Protokollname.
Ein schema ist bestehend aus [a-z]+:
// leitet bereits den Authority-Part ein, der aber ja nach schema gestaltet ist.
Du musst also expliziter werden welche schema URIs du erfassen willst.
An Protokollen kann eigentlich viel vorkommen. ftp, http, https usw. Eigentlich nur Protokolle die mit dem Browser direkt benutzt werden können ohne Anpassungen. Bzw Protokolle die Suchmaschinen liefern könnten. Zumindest die drei genannten. Und deren Schema dürfte, wenn ich mich nicht irre, relativ ähnlich sein.
Kommt danach ein "?" gibt es GET-Parameter die immer getrennt sind durch "&". Und Variable und Wert sind getrennt durch "=".
Ein ? leitet den Query-String ein. Dessen interne Struktur braucht dich nicht zu interessieren.
In meinem Fall interessiert es nicht wirklich. Aber wenn man wirklich alle Teile einer URL abspeichern will dann könnte das schon dazugehören.
Es kann aber auch sein dass nach dem Dateinamen noch ein "/" kommt und irgendwelche Zeichen.
Der schluss auf eine Datei in einer URI ist gewagt. Welcher Teil einer URI auf eine Ressource zutrifft, weiss nur der behandelnde Server.
Wenn keine Datei angegeben ist dann müsste doch das letzte "/" ein Verzeichnis abschließen in welchem eine Standarddatei liegt wie index.php oder ähnlich die bei Nichtangabe einer Datei dann aufgerufen wird.
Es kann auch ohne "/" am Ende sein aber dann gibt es keine Get-Parameter die mit "?" anfangen dahinter oder würde das hier funktionieren wenn im Verzeichnis dir2 eine index.php liegt? selfhtml.org/dir1/dir2?id=1
Die Frage ist eher, warum du einen URI zerlegen musst.
Ich will in einem Programm URLs sortieren nach meinen Maßgaben. ZB erst der Domainname, dann die Subdomains in umgekehrter Reihenfolge usw.
Grüße!
Sebastian
Hi,
An Protokollen kann eigentlich viel vorkommen. ftp, http, https usw.
mailto:
Eigentlich nur Protokolle die mit dem Browser direkt benutzt werden können ohne Anpassungen.
javascript:
Bzw Protokolle die Suchmaschinen liefern könnten.
gopher://
Zumindest die drei genannten. Und deren Schema dürfte, wenn ich mich nicht irre, relativ ähnlich sein.
Ja, relativ.
Ein ? leitet den Query-String ein. Dessen interne Struktur braucht dich nicht zu interessieren.
In meinem Fall interessiert es nicht wirklich. Aber wenn man wirklich alle Teile einer URL abspeichern will dann könnte das schon dazugehören.
Ja, und eine Trennung der Parameter (keiner derer Teile übrigens etwas mit Variablen zu tun hat) per Semikolon ist recht üblich.
Wenn keine Datei angegeben ist dann müsste doch das letzte "/" ein Verzeichnis abschließen in welchem eine Standarddatei liegt wie index.php oder ähnlich die bei Nichtangabe einer Datei dann aufgerufen wird.
Trenne Dich bitte von dem Begriff "Datei". Du kannst einer URL nicht ansehen, ob der Server überhaupt Dateien kennt. Okay, bei ftp-URLs vielleicht.
Es kann auch ohne "/" am Ende sein aber dann gibt es keine Get-Parameter die mit "?" anfangen dahinter oder würde das hier funktionieren wenn im Verzeichnis dir2 eine index.php liegt?
selfhtml.org/dir1/dir2?id=1
Der Localpart der URL ist Sache des Servers. Ihn aufzuteilen hat ausschließlich für eines Sinngehalt: zur Auflösung relativer URIs wie "../foo".
Ich will in einem Programm URLs sortieren nach meinen Maßgaben. ZB erst der Domainname, dann die Subdomains in umgekehrter Reihenfolge usw.
Vergiss nicht Port und Credentials. Sie sind vergleichsweise selten, aber möglich. Ob Dich ein Fragment Identifier interessiert, kannst Du selbst entscheiden; im Zweifel solltest Du ihn aber mindestens entfernen können.
Cheatah
Hallo,
Bzw Protokolle die Suchmaschinen liefern könnten.
gopher://
gibt's das überhaupt noch? Ich kenne das nur aus der Sage, bin diesem Protokoll aber nie in freier Wildbahn begegnet, und kenne auch niemanden, der das wirklich kennt oder gar mal verwendet hat.
Ciao,
Martin
Hi,
Bzw Protokolle die Suchmaschinen liefern könnten.
gopher://
gibt's das überhaupt noch? Ich kenne das nur aus der Sage, bin diesem Protokoll aber nie in freier Wildbahn begegnet, und kenne auch niemanden, der das wirklich kennt oder gar mal verwendet hat.
es wurde wegen chronischem Aussterbens aus vielen Systemen rausimplementiert. Ich bin mir aber sicher, irgendwo auf der Welt wird noch ein Gopher-Server betrieben, wenn's sein muss mit der Handkurbel - und wenn dem so ist, wird eine Suchmaschine ihn finden! ;-)
Cheatah
Hi!
Ich bin mir aber sicher, irgendwo auf der Welt wird noch ein Gopher-Server betrieben, wenn's sein muss mit der Handkurbel - und wenn dem so ist, wird eine Suchmaschine ihn finden! ;-)
Klar gibt es das Erdhörnchen noch, z.B: hier im Netz.
Ich kenne auch noch einige Unternehmen, die intern Gopher-Server benutzen.
off:PP
Kann ich das so benutzen oder habe ich etwas als gegeben angesehen was nicht der Fall ist?
Nicht wirlich - du solltest dich in erster Linie mit den grundlegenden syntaktischen Gegebenheiten von URLs befassen - das Lesen des Wikipedia-Artikels zu diesem Thema hätte dir schon einige Fehler erspart.
Identifizierbar durch das Vorkommen von "://" in der URL.
Das ist dein erstes Problem, nicht in jedem URL kommt das notwendierweise vor:
mailto:random@example.com
Dann kommen mögliche Subdomains
Das ist dein 2. Problem: Einerseits kommen danach optional irgendwelche benutzername und passwort, andererseits kann der Hostname auch ein ein glied besitzen, eine IP-Adresse sein oder aber mit einem port enden
http://foo:bar@example.com/
http://invalid/
http://example.com:80/
http://foo:bar@invalid:443/
Alles kein Problem.
Sobald ein "." zwischen den "/" liegt wird es vermutlich der Dateiname mit Erweiterung sein.
/foo.bar/baz.de.html
/foo/bar/baz/
/foo
/
/index.php/foo/bar
Alles gültige Pfade: aufgrund deiner Vorstellung von Pfaden - besonders hinsichtlich der "Ordner und Dateinamen"-Sache hast du aber hier ein Problem beim Parsen.
Kommt danach ein "?" gibt es GET-Parameter die immer getrennt sind durch "&". Und Variable und Wert sind getrennt durch "=".
Auch wieder falsch
wert1&wert2&wert3
wert;parameter=wert2
wert
wert1=1&wert2=2
Alles gültige querystrings - es müssen nicht notwendigerweise "Werte" nach den "Parametern" vorhanden sein, noch müssen notwendigerweise durch ein & separiert sein - auch hier sind verschiedene Trennzeichen vorgesehen - genauergesagt ; und &.
Danach kommt ggf. noch das Fragment - das sollte aber wohl beim Server nicht ankommen.
In Summe: Du hast nicht beschrieben was du eigentlich willst und vor allem gehst davon aus, dass das noch nie jemand gemacht hat und versuchst dir jetzt ohne dich in die technischen Grundlagen eingearbeitet zu haben irgend eine Funktion zusammenzustopseln. Das gute daran ist, dass du dich vorher erkundist, ob das nicht gegebenenfalls zu Fehlern führt - und das ist imho ein sehr wichtiger Schritt, denn wie du siehst ist dein Ansatz vermutlich im Grunde falsch.
Wenn du rausrückst mit welcher Technik du URLs zerlegen willst und aus welcher Quelle diese stammen kann man dir her weiterhelfen - fast jede Sprache stellt hierfür bereits etwas fertiges zur Verfügung:
PHP stellt hier z.B. parse_url() und parse_str() zur Verfügung um den URL sowie den Querystring zu zerlegen - den hostnamen kann man dann explode() (wenn man die Punkte nicht braucht) oder preg_split() zerlegen (oder die punkte behalten will, da sie zu den gliedern des Hostnamens dazugehören).
Danke auch dir. Wald vor lauter Bäumen halt... *g*
Hast auch einige gute Einwände gehabt an die ich nicht gedacht oder gewußt habe. Ich hoffe mal mit der Funktion wird das alles beachtet werden.
Hi,
http://foo:bar@example.com/
Das ist keine URL.
Bei http(s) sind username+passwort nicht erlaubt. (Bei z.B. FTP wär's erlaubt).
http://foo:bar@invalid:443/
s.o.
Alles kein Problem.
Außer der Ungültigkeit.
cu,
Andreas
http://foo:bar@example.com/
Das ist keine URL.
Du hast ja Recht - aber der IE6 ist der einzige Browser der das korrekt umsetzt :p
Hi,
http://foo:bar@example.com/
Das ist keine URL.
Du hast ja Recht - aber der IE6 ist der einzige Browser der das korrekt umsetzt :p
... wenn man ihn mit einem Tritt in den Hintern (sprich: Registry-Eingriff) dazu ermächtigt.
Gibt es eigentlich eine Möglichkeit, das auch neueren Opera-Versionen beizubringen? Ich habe eine Menge Bookmarks mit username:password-Prefix, und es ist lästig, jedesmal *trotzdem* die Zugangsdaten von Hand eingeben zu müssen.
So long,
Martin
Das ist dein erstes Problem, nicht in jedem URL kommt das notwendierweise vor:
mailto:random@example.com
Das ist keine URL. ;)
mailto:random@example.com
Das ist keine URL. ;)
RFC 1738: Uniform Resource Locators (URL)
Abschnitt 3.5:
A mailto URL takes the form:
mailto:<rfc822-addr-spec>
Ja, es bezieht sich auf RFC 822 - aber auch nur, weil es zu dem Zeitpunkt RFC 2822 noch nicht gab :p
Wenn du es drauf anlegen willst ist es kein URL, aber ein URI :p
RFC 2396 Abschnitt 1.3 bzw. RFC 3986 Abschnitt 1.1.2 sowie 3.3
Und jetzt sei kein Erbsenzähler ;)
Hi,
Ja, es bezieht sich auf RFC 822 - aber auch nur, weil es zu dem Zeitpunkt RFC 2822 noch nicht gab :p
Wen interessiert denn noch 2822, die ist doch auch veraltet. 5322 ist die aktuelle ...
(immerhin sind die letzten 2 Stellen immer gleich - die wollten wohl nicht warten, bis die 5_8_22 dran war ...)
Und jetzt sei kein Erbsenzähler ;)
1 Erbse, 2 Erbsen, 3 Erbsen, ...
cu,
Andreas
Ja, es bezieht sich auf RFC 822 - aber auch nur, weil es zu dem Zeitpunkt RFC 2822 noch nicht gab :p
Wen interessiert denn noch 2822, die ist doch auch veraltet. 5322 ist die aktuelle ...
RFC 2822 ist die erste RFC die E-Mail-Adressen wie wir sie heute kennen beschreibt - ich sagte auch nicht, dass es die aktuelle ist :p
Hi,
RFC 2822 ist die erste RFC die E-Mail-Adressen wie wir sie heute kennen beschreibt - ich sagte auch nicht, dass es die aktuelle ist :p
E-Mail-Adressen wie bla.blubb@example.org hat auch die RFC 822 schon beschrieben (weiß ich, weil ich erst vor ein paar Tagen nachgeguckt hab, ob das '-' unmittelbar vor dem @ schon immer erlaubt war oder ob das erst nachträglich erlaubt wurde, und das auch noch jemandem nachgewiesen habe anhand der Regeln - da gab's auch eine Frage von mir hier im Forum dazu wegen der ABNF ...)
cu,
Andreas
RFC 2822 ist die erste RFC die E-Mail-Adressen wie wir sie heute kennen beschreibt - ich sagte auch nicht, dass es die aktuelle ist :p
E-Mail-Adressen wie bla.blubb@example.org hat auch die RFC 822 schon beschrieben [---]
Im ARPANET gabs aber kein example.com oder example.org und kein DNS im heutigen Sinn :p
hi,
Ich bin gerade dabei ein einfaches Skript zu schreiben mit dem jede art von URL in seine Bestandteile zerlegt werden können soll. Dabei setze ich auf das Vorhandensein von bestimmten Zeichen in der URL um das tun zu können. Könnt ihr mal Kritik üben wenn eine meiner Annahmen falsch ist?
Hmm. Meine Kritik: "Warum nun gerade das jetzt selbst machen?" In Perl (URI::Split) und PHP gibt es Funktionen/Methoden, die tun das RFC gerecht und fertig.
#!perl
use URI::Split qw(uri_split);
($scheme, $auth, $path, $query, $frag) = uri_split($URI);
In Perl gibts da noch
use URI;
use URI::QueryParam;
falls Du den QS noch parsen möchtest (z.B. Suchmaschinen-Referrer auswerten).
Hotti
Hmm. Meine Kritik: "Warum nun gerade das jetzt selbst machen?" In Perl (URI::Split) und PHP gibt es Funktionen/Methoden, die tun das RFC gerecht und fertig.
Oh man... da beschäftige ich mich die ganze Zeit jetzt damit was ich auswerten will und wie und suche nach den erlaubten Zeichen und komme gar nicht auf den Gedanken erstmal zu schauen ob es dafür bereits eine Funktion gibt... :P
Und scheinbar gibts so etwas... Link danke für die Idee...
Sobald ein "." zwischen den "/" liegt wird es vermutlich der Dateiname mit Erweiterung sein. Obwohl ich mir nicht sicher bin dass es nicht doch sein könnte dass ein Verzeichnis einen "." enthält. Wenn man dann bei der Datei ist kann man Dateiname und Erweiterung ablesen. Sofern natürlich ein Dateiname angegeben wurde.
Ohne jetzt alle bisherigen Antworten gelesen zu haben...
Meine Facebook-Seite ist unter http://www.facebook.com/filmfreunde.net erreichbar. Ist aber keine .net-Datei namens filmfreunde, sondern letztlich insgesamt eine Variable (Nutzername). Von daher wird die Aufsplittung anhand von bestimmten Zeichen immer irgendwo an seine Grenzen geraten. Da ist heutzutage schlicht alles möglich, ohne dass man es verallgemeinern könnte.
Gruß,
Andreas