Regulärer Ausdruck: URL matchen
Dirk
- programmiertechnik
0 Der Martin
0 worf
0 Johannes Zeller
Hallo zusammen,
ich suche schon seit 2 Stunden und bastel was zusammen, aber ich komme auf keinen grünen Zweig. Simples Problem: Ich will überprüfen, ob eine Variable eine gültige URL ist und keine bösen Zeichen enthält. Der Ausdruck soll ziemlich tolerant sein:
www.test.de
test.de
http://www.test.de
http://test.de
http://www.test.co.uk
http://test.co.uk
test.co.uk
www.test.co.uk
https://www.test.co.uk
https://test.co.uk
sollen mindestens möglich sein, ich habe sicher die eine oder andere gültige Url vergessen. Gibt es da was? Ich habe folgendes gefunden, was aber wohl nicht so richtig funktioniert:
function pruefe_url($variable)
{
//return preg_match("(([\w]+:)?//)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w].)+[\w]{2,4}(:[\d]+)?(/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?", $url);
return !(ereg("(([\w]+:)?//)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w].)+[\w]{2,4}(:[\d]+)?(/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?", $variable));
}
if (pruefe_url('www.test.de')) echo 'gültig'; else echo 'ungültig'; echo '<br>';
if (pruefe_url('test.de')) echo 'gültig'; else echo 'ungültig'; echo '<br>';
if (pruefe_url('http://www.test.de')) echo 'gültig'; else echo 'ungültig'; echo '<br>';
if (pruefe_url('http:/<>')) echo 'gültig'; else echo 'ungültig'; echo '<br>';
gibt aus:
gültig
gültig
gültig
gültig
und zumindest die letzte Ausgabe sollte eigentlich ungültig sein...
viele Grüße,
Dirk
Hi,
Ich will überprüfen, ob eine Variable eine gültige URL ist und keine bösen Zeichen enthält. Der Ausdruck soll ziemlich tolerant sein
und genau in dieser Toleranz liegt wohl das Problem.
www.test.de
test.de
Hast du einen Deal mit der Stiftung Warentest?
Davon abgesehen: Hinsichtlich der Mustererkennung sind diese beiden Ausdrücke, auch wenn sie unterschideliche URLs benennen, eigentlich gleichwertig: Eine oder mehrere Gruppen aus Buchstaben und Ziffern, die durch Punkte getrennt sind.
Ich persönlich würde aber zumindest das Protokoll-Präfx als Muss-Angabe fordern.
http://www.test.co.uk
http://test.co.uk
test.co.uk
www.test.co.uk
https://www.test.co.uk
https://test.co.uk
Dasselbe in grün.
sollen mindestens möglich sein, ich habe sicher die eine oder andere gültige Url vergessen. Gibt es da was?
Ja - was ist mit ftp-Adressen? Was ist mit http://localhost/ oder ftp://174.37.27.164/ oder https://localhost?blau=48&gruen=4 und ähnlichen Konstrukten?
Letzten Endes leuchtet mir nicht ein, warum du eine URL formal auf Gültigkeit überprüfen möchtest. Im konkreten Fall kommt es doch drauf an, dass die dadurch referenzierte Ressource erreichbar ist. _Das_ solltest du vielleicht einfach prüfen, anstatt irgendwelchen Schemata anzuwenden.
So long,
Martin
ich hätte da doch auch noch ein paar Bespiele beizusteuern:
Ein Passwort-geschütztes Verzeichnis:
http://user:password@example.com
Zusätzliche Port-Angabe und PATH_INFO:
http://www.example.com:8080/index.php/apath/atarget.xml?aparameter=1
.. und dann kommt ja noch die Umstellung auf IPv6, dann sieht die Schreibweise mit Angabe der IP nochmal anders aus..
Hallo,
Ein Passwort-geschütztes Verzeichnis:
http://user:password@example.com
ja, das ist aber in HTTP ausdrücklich NICHT Teil des Standards, obwohl es weitläufig -auch von vielen Browsern- verstanden und richtig umgesetzt wird. Auch wenn manche (IE6) dazu erst einen Schlag auf den Hinterkopf brauchen.
Zusätzliche Port-Angabe und PATH_INFO:
http://www.example.com:8080/index.php/apath/atarget.xml?aparameter=1
Okay, das mit der Portnummer ist eine wertvolle Info - zum Rest sei gesagt, dass nach dem Slash, der den Hostnamen (und ggf. die Portangabe) vom Local-part trennt, so ziemlich alles möglich ist.
.. und dann kommt ja noch die Umstellung auf IPv6, dann sieht die Schreibweise mit Angabe der IP nochmal anders aus..
Oh, da hab' ich noch gar keine Ahnung, wie das dann aussieht ...
Ciao,
Martin
Hmmm, eigentlich wollte ich das Ding prüfen, ob sich irgendwas Böses drin versteckt, Stichwort SQL Injection oder Javascript oder beispielsweise ein Mailspammer. Schliesslich will ich die URL nach Prüfung verschicken und in eine DB schreiben. Wenn sie nicht korrekt wär, soll eine Fehlermeldung kommen, die den Nutzer um Verbesserung bittet und nichts verschickt bzw. speichert. Das war der Plan...
viele Grüße,
Dirk
Hi Dirk,
Das war der Plan...
Falscher Ansatz... Ich werf dir mal ein paar Stichworte vor die Füße:
MySQL:
Hier geht es um das Escapen im MySQL-Query, mysql_real_escape_string() in PHP, Adäquat in anderer Programmiersprache
Javascript:
Läuft ja auf Ausgabe im HTML Kontext hinaus, hier ist entsprechendes Escaping erforderlich, htmlspecialchars() in PHP, Adäquat in anderer Programmiersprache.
Mailspam:
Ich weiß nicht genau, wo drauf du hinaus willst. Wenn du den Text in irgendeinem Mail-Header platzieren willst, musst du auf Newline-Zeichen prüfen, falls du es einfach in den Mail-Body reinschmeißt ist auch recht egal was drin steht (solange keine HTML-Mail, sonst siehe -> HTML) ;-)
Und last but not least: Das Zend Framework bringt mit Zend_Uri::check() eine Möglichkeit mit URIs auf ihre Gültigkeit zu prüfen (dürfte aber vermutlich example.com als ungültig und lediglich http://example.com als gültig ansehen, müsstest du dir mal näher anschauen).
Viele Grüße,
~ Dennis.
Hallo Dirk,
ich vermute mal, du kennst http://forum.de.selfhtml.org/archiv/2000/9/t21614/#m110363 noch nicht? Dieser RegEx ist übrigens inzwischen, z.B. wegen der Einführung von IDN-Domains, auch schon wieder obsolet, aber das ist nebensächlich.
Es ist ein ziemlich schwieriger Fall, zu überprüfen ob eine Domain syntaktisch korrekt ist, deswegen würde ich nur auf ein paar Merkmale prüfen und ansonsten in Kauf nehmen, dass die URL falsch ist. In den allermeisten Fällen sollte das ausreichen, schließlich ist es auch kein Problem, eine valide URL ohne Ziel anzugeben.
Schöne Grüße,
Johannes