Welche Zeichen machen eine URL ungültig?
Sind diese URLs gültig?
example.com/file[/].html
http://example.com/file[/].html
Welche Zeichen machen eine URL ungültig?
Sind diese URLs gültig?
example.com/file[/].html
http://example.com/file[/].html
Einige der Unicode-Zeichenbereiche sind gültige HTML5 obwohl es vielleicht trotzdem keine gute Idee ist, sie zu verwenden.
Z.B., href
Die Ärzte sagen http://www.w3.org/TR/html5/links.html#attr-hyperlink-href :
Das href-Attribut von a- und area-Elementen muss einen Wert haben, der eine gültige URL ist, die möglicherweise von Leerzeichen umgeben ist.
Die Definition von "gültiger URL" zeigt dann auf http://url.spec.whatwg.org/ die nach eigenen Angaben darauf abzielt:
Anpassung von RFC 3986 und RFC 3987 an zeitgemäße Implementierungen und damit deren Überwindung.
Dieses Dokument definiert URL-Code-Punkte als:
ASCII alphanumerisch, "!", "$", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", ":", ";", "=", "? ", "@", "_", "~", und Codepunkte in den Bereichen U+00A0 bis U+D7FF, U+E000 bis U+FDCF, U+FDF0 bis U+FFFD, U+10000 bis U+1FFFD, U+20000 bis U+2FFFD, U+30000 bis U+3FFFD, U+40000 bis U+4FFFD, U+50000 bis U+5FFFD, U+60000 bis U+6FFFD, U+70000 bis U+7FFFD, U+80000 bis U+8FFFD, U+90000 bis U+9FFFD, U+A0000 bis U+AFFFD, U+B0000 bis U+BFFFD, U+C0000 bis U+CFFFD, U+D0000 bis U+DFFFD, U+E1000 bis U+EFFFD, U+F0000 bis U+FFFFD, U+100000 bis U+10FFFD.
In der Erklärung wird dann der Begriff "URL-Codepunkte" verwendet:
Wenn c kein URL-Codepunkt und nicht "%" ist, Parse-Fehler.
in mehreren Teilen des Parsing-Algorithmus, einschließlich des Schemas, der Autorität, des relativen Pfads, der Abfrage und des Fragmentstatus: also im Grunde die gesamte URL.
Auch der Validator http://validator.w3.org/ geht für URLs wie ""
und gilt nicht für URLs mit Zeichen wie Leerzeichen "a b"
Natürlich geht es, wie von Stephen C. erwähnt, nicht nur um Zeichen, sondern auch um den Kontext: Sie müssen den gesamten Algorithmus verstehen. Aber da die Klasse "URL-Code-Punkte" auf Schlüsselpunkte des Algorithmus angewendet wird, gibt sie eine gute Vorstellung davon, was man verwenden kann und was nicht.
Siehe auch: Unicode-Zeichen in URLs
Ich musste Zeichen auswählen, um URLs in einer Zeichenkette aufzuteilen, also beschloss ich, eine Liste von Zeichen zu erstellen, die in der URL selbst nicht gefunden werden konnten:
>>> allowed = "-_.~!*'();:@&=+$,/?%#[]?@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
>>> from string import printable
>>> ''.join(set(printable).difference(set(allowed)))
'`" <\x0b\n\r\x0c\\\t{^}|>'
Die möglichen Optionen sind also Zeilenumbruch, Tabulator, Leerzeichen, Backslash und "<>{}^|
. Ich denke, ich werde das Leerzeichen oder den Zeilenumbruch nehmen :)
Ich implementiere eine alte HTTP (0.9, 1.0, 1.1) Anfrage und Antwort Leser / Schreiber. Die Anfrage-URI ist die problematischste Stelle.
Sie können nicht einfach RFC 1738, 2396 oder 3986 verwenden. Es gibt viele alte HTTP-Clients und -Server, die mehr Zeichen zulassen. Deshalb habe ich Nachforschungen angestellt, die auf zufällig veröffentlichten Webserver-Zugriffsprotokollen basieren: "GET URI HTTP/1.0" 200
.
Ich habe festgestellt, dass die folgenden nicht standardisierten Zeichen häufig in URIs verwendet werden:
\ { } < > | ` ^ "
Diese Zeichen wurden beschrieben in RFC 1738 als unsicher .
Wenn Sie mit allen alten HTTP-Clients und -Servern kompatibel sein wollen, müssen Sie diese Zeichen erlauben in der Anfrage-URI.
Weitere Informationen über diese Forschung finden Sie unter oghttp-request-collector .
Das ist nicht wirklich eine Antwort auf Ihre Frage, aber die Validierung von URLs ist wirklich ein ernstes Problem. Es ist wahrscheinlich besser, nur den Domänennamen zu validieren und den Abfrageteil der URL zu lassen. Das ist meine Erfahrung.
Sie könnten auch die URL anpingen und sehen, ob sie eine gültige Antwort liefert, aber das könnte zu viel für eine so einfache Aufgabe sein.
Reguläre Ausdrücke zur Erkennung von URLs gibt es zuhauf, googeln Sie mal danach :)
Diese Antwort weist darauf hin, dass die URL-Validierung keine Aufgabe für eine Regex ist, sondern für eine Sprach-/Plattform-spezifische Bibliothek .
Ich habe mir ein paar reguläre Ausdrücke für PHP ausgedacht, die URLs im Text in Anker-Tags umwandeln. (Zuerst konvertiert es alle www. URLs zu http:// und konvertiert dann alle URLs mit https?:// zu einer href=... HTML-Links
$string = preg_replace('/(https?:\/\/)([!#$&-;=?\-\[\]_a-z~%]+)/sim', '<a href="$1$2">$2</a>', preg_replace('/(\s)((www\.)([!#$&-;=?\-\[\]_a-z~%]+))/sim', '$1http://$2', $string) );
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.