Wie kann ich überprüfen, ob eine bestimmte Zeichenfolge eine gültige URL-Adresse ist?
Meine Kenntnisse über reguläre Ausdrücke sind grundlegend und erlauben mir nicht, aus den Hunderten von regulären Ausdrücken auszuwählen, die ich bereits im Web gesehen habe.
regex
url
language-agnostic
Vitor Silva
quelle
quelle
Antworten:
Ich habe mein URL-Muster (tatsächlich IRI, internationalisiert) geschrieben, um RFC 3987 ( http://www.faqs.org/rfcs/rfc3987.html ) zu entsprechen. Diese sind in PCRE-Syntax.
Für absolute IRIs (internationalisiert):
So lassen Sie auch relative IRIs zu:
Wie sie kompiliert wurden (in PHP):
Bearbeiten 7. März 2011: Aufgrund der Art und Weise, wie PHP Backslashes in Anführungszeichen behandelt, sind diese standardmäßig unbrauchbar. Sie müssen Backslashes doppelt maskieren, es sei denn, der Backslash hat in Regex eine besondere Bedeutung. Sie können dies folgendermaßen tun:
quelle
http://com
ist eine gültige URL.http://localhost
ist, warum sollten andere Wörter nicht sein? Sie haben Recht, dass deru
Modifikator in PHP erforderlich ist. Ich möchte klarstellen, dass diese zwar mit PHP generiert wurden, aber nicht PHP-spezifisch sein sollen.Ich habe gerade einen Blog-Beitrag für eine großartige Lösung zum Erkennen von URLs in den am häufigsten verwendeten Formaten verfasst, z.
www.google.com
http://www.google.com
mailto:[email protected]
[email protected]
www.url-with-querystring.com/?url=has-querystring
Der reguläre Ausdruck lautet:
quelle
/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(:[0-9]+)?|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/
width:210px;
undmargin:3px
Welche Plattform? Verwenden Sie bei Verwendung von .NET
System.Uri.TryCreate
keinen regulären Ausdruck.Zum Beispiel:
(Danke an @Yoshi für den Tipp über
javascript:
)quelle
javascript: alert('blah')
. Sie müssen eine weitere Überprüfung von Uri.Scheme durchführen , um zu bestätigen, dass das http / https / ftp-Protokoll verwendet wird. Andernfalls sind Ihre Benutzer anfällig für XSS-Angriffe , wenn eine solche URL als Link in den HTML- Code Ihrer ASP.NET-Seiten eingefügt wird .Uri.IsWellFormedUriString()
Hier ist, was RegexBuddy verwendet.
Es entspricht diesen unten (innerhalb der
** **
Markierungen):Sie können RegexBuddy unter http://www.regexbuddy.com/download.html herunterladen .
quelle
/\b(https?|ftp|file):\/\/[\-A-Za-z0-9+&@#\/%?=~_|!:,.;]*[\-A-Za-z0-9+&@#\/%=~_|]/
In Bezug auf den Antwortbeitrag von eyelidness mit der Aufschrift "Dies basiert auf meiner Lektüre der URI-Spezifikation.": Dank Eyelidness ist Ihre Lösung die perfekte, die ich gesucht habe, da sie auf der URI-Spezifikation basiert! Hervorragende Arbeit. :) :)
Ich musste zwei Änderungsanträge stellen. Der erste, der den regulären Ausdruck dazu bringt, IP-Adress-URLs in PHP (v5.2.10) mit der Funktion preg_match () korrekt abzugleichen.
Ich musste der Zeile über "IP-Adresse" um die Pipes einen weiteren Satz Klammern hinzufügen:
Nicht sicher warum.
Ich habe auch die Mindestlänge der Domain der obersten Ebene von 3 auf 2 Buchstaben reduziert, um .co.uk und ähnliches zu unterstützen.
Endgültiger Code:
Diese geänderte Version wurde nicht mit der URI-Spezifikation verglichen, daher kann ich nicht für deren Konformität bürgen. Sie wurde geändert, um URLs in lokalen Netzwerkumgebungen und zweistelligen TLDs sowie andere Arten von Web-URLs zu verarbeiten und in PHP besser zu funktionieren Setup benutze ich.
Als PHP- Code:
Hier ist ein Testprogramm in PHP, das eine Vielzahl von URLs mithilfe des regulären Ausdrucks überprüft:
Nochmals vielen Dank an Augenlid für die Regex!
quelle
')((([a-z0-9][a-z0-9-]*[a-z0-9]\.)*'.
durch zu ersetzen')((([a-z0-9]\.|[a-z0-9][a-z0-9-]*[a-z0-9]\.)*'.
. " Ich habe die entsprechende Bearbeitung basierend auf diesem Kommentar vorgenommen./^(https?|ftp):
(Protokoll) Warum verbieten Sie Protokolle wie Daten, Dateien, SVN, DC ++, Magnete, Skype oder andere, die von einem Browser mit dem entsprechenden Plugin oder einem Server unterstützt werden?Mathias Bynens hat einen großartigen Artikel über den besten Vergleich vieler regulärer Ausdrücke: Auf der Suche nach dem perfekten Regex für die URL-Validierung
Das beste, das gepostet wird, ist etwas lang, aber es passt zu fast allem, was man darauf werfen kann.
JavaScript-Version
PHP-Version
quelle
%^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@|\d{1,3}(?:\.\d{1,3}){3}|(?:(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)(?:\.(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)*(?:\.[a-z\x{00a1}-\x{ffff}]{2,6}))(?::\d+)?(?:[^\s]*)?$%iu
Der Beitrag Teile einer URL abrufen (Regex) beschreibt das Parsen einer URL, um ihre verschiedenen Komponenten zu identifizieren. Wenn Sie überprüfen möchten, ob eine URL wohlgeformt ist, sollte sie für Ihre Anforderungen ausreichen.
Wenn Sie überprüfen müssen, ob es tatsächlich gültig ist, müssen Sie eventuell versuchen, auf das zuzugreifen, was sich am anderen Ende befindet.
Im Allgemeinen ist es jedoch wahrscheinlich besser, eine Funktion zu verwenden, die Ihnen von Ihrem Framework oder einer anderen Bibliothek bereitgestellt wird. Viele Plattformen enthalten Funktionen zum Parsen von URLs. Zum Beispiel gibt es das urlparse- Modul von Python , und in .NET können Sie den Konstruktor der System.Uri-Klasse als Mittel zum Überprüfen der URL verwenden.
quelle
Dies ist möglicherweise keine Aufgabe für reguläre Ausdrücke, sondern für vorhandene Tools in der Sprache Ihrer Wahl. Sie möchten wahrscheinlich vorhandenen Code verwenden, der bereits geschrieben, getestet und debuggt wurde.
Verwenden Sie in PHP die
parse_url
Funktion.Perl:
URI
Modul .Ruby:
URI
Modul ..NET: 'Uri'-Klasse
Regexes sind kein Zauberstab, mit dem Sie bei jedem Problem winken, bei dem es sich um Saiten handelt.
quelle
java.net.URL
.Nicht validierender URI-Referenz-Parser
Zu Referenzzwecken finden Sie hier die IETF-Spezifikation: ( TXT | HTML ). Insbesondere in Anhang B. Das Parsen einer URI-Referenz mit einem regulären Ausdruck zeigt, wie eine gültige Regex analysiert wird . Dies wird beschrieben als:
Hier ist der reguläre Ausdruck, den sie bereitstellen:
Wie jemand anderes sagte, ist es wahrscheinlich am besten, dies einer Bibliothek / einem Framework zu überlassen, die Sie bereits verwenden.
quelle
Dies stimmt mit allen URLs überein
... einschließlich Subdomains und neuer Domainnamenerweiterungen der obersten Ebene wie z. Museum ,. Akademie ,. Stiftung usw., die bis zu 63 Zeichen enthalten kann (nicht nur. com ,. net ,. info usw.)
Denn heute beträgt die maximale Länge der verfügbaren Domainnamenerweiterung der obersten Ebene 13 Zeichen, z. International können Sie die Zahl 63 im Ausdruck in 13 ändern, um zu verhindern, dass jemand sie missbraucht.
als Javascript
Wikipedia-Artikel: Liste aller Internet-Top-Level-Domains
quelle
t.co
. Wie würden Sie es anpassen, um diesen Fall zu behandeln?Der beste reguläre Ausdruck für URL wäre für mich:
quelle
(([\\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})*)?
\w
mit\p{L}
auf ein Minimum.([\d\w][-\d\w]{0,253}[\d\w]\.)+
in([\d\w][-\d\w]{0,253}[\d\w]?\.)+
(füge ein Fragezeichen am Ende hinzu)Übereinstimmungen http://site.com/dir/file.php?var=moo | ftp: // user: [email protected]: 21 / file / dir
Nicht übereinstimmende site.com | http://site.com/dir//
quelle
http://www.goo gle.com
wird übereinstimmen.Übereinstimmungen http://www.asdah.com/~joe | ftp://ftp.asdah.co.uk:2828/asdah%20asdah.gif | https://asdah.gov/asdh-ah.as
quelle
Ich konnte den gesuchten regulären Ausdruck nicht finden, daher habe ich einen regulären Ausdruck geändert, um meine Anforderungen zu erfüllen, und anscheinend scheint er jetzt gut zu funktionieren. Meine Anforderungen waren:
Hier, was ich mir ausgedacht habe, wird jeder Vorschlag geschätzt:
quelle
Wenn Sie wirklich nach dem ultimativen Match suchen , finden Sie es wahrscheinlich auf " A Good Url Regular Expression? ".
Aber eine Regex, die wirklich zu allen möglichen Domänen passt und alles erlaubt, was laut RFCs erlaubt ist, ist schrecklich lang und unlesbar, vertrau mir ;-)
quelle
Ich habe an einem ausführlichen Artikel über die URI-Validierung mit regulären Ausdrücken gearbeitet. Es basiert auf RFC3986.
URI-Validierung für reguläre Ausdrücke
Obwohl der Artikel noch nicht vollständig ist, habe ich eine PHP-Funktion entwickelt, mit der sich HTTP- und FTP-URLs recht gut überprüfen lassen. Hier ist die aktuelle Version:
Diese Funktion verwendet zwei reguläre Ausdrücke. eine zum Abgleichen einer Teilmenge gültiger generischer URIs (absolute URIs mit einem nicht leeren Host) und eine zweite zum Überprüfen des DNS-Hostnamens "Punkt-getrennte Teile". Obwohl diese Funktion derzeit nur HTTP- und FTP-Schemata validiert, ist sie so strukturiert, dass sie problemlos auf andere Schemata erweitert werden kann.
quelle
Ich habe eine kleine groovige Version geschrieben, die du ausführen kannst
es stimmt mit den folgenden URLs überein (was für mich gut genug ist)
http://google.com
http://google.com/help.php
http://google.com/help.php?a=5
http://www.google.com
http://www.google.com/help.php
http://www.google.com?a=5
google.com?a=5
google.com/help.php
google.com/help.php?a=5
http://www.m.google.com/help.php?a=5 (und alle seine Permutationen)
www.m.google.com/help.php?a=5 (und alle seine Permutationen)
m.google.com/help.php?a=5 (und alle seine Permutationen)
Das Wichtigste für URLs, die nicht mit http oder www beginnen, ist, dass sie ein / oder enthalten müssen.
Ich wette, das kann ein bisschen mehr optimiert werden, aber es macht den Job ziemlich gut, weil es so kurz und kompakt ist ... weil man es so ziemlich in 3 Teile teilen kann:
Finden Sie alles, was mit http: https ?: // w {0,3} \ w *? beginnt. \ w {2,3} \ S *
Finden Sie alles, was mit www beginnt: www. \ w * ?. \ w {2,3} \ S *
oder etwas finden, das einen Text haben muss, dann einen Punkt, dann mindestens 2 Buchstaben und dann ein? oder /: \ w * ?. \ w {2,3} [/ \?] \ S *
quelle
-
in der URL nicht unterstützt .Ich benutze diesen regulären Ausdruck:
Um beide zu unterstützen:
Und:
quelle
((https?:)?(\/?\/))(([\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,63}(:[\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})*)?
((?:https?:)?(?:\/?\/))((?:[\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,63})(:[\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})*)?
Hier ist eine gute Regel, die alle möglichen Fälle abdeckt: Ports, Parameter und etc.
quelle
Dieser funktioniert bei mir sehr gut.
(https?|ftp)://(www\d?|[a-zA-Z0-9]+)?\.[a-zA-Z0-9-]+(\:|\.)([a-zA-Z0-9.]+|(\d+)?)([/?:].*)?
quelle
Hier ist eine einsatzbereite Java-Version aus dem Android-Quellcode. Dies ist das beste, das ich gefunden habe.
quelle
Hier ist ein regulärer Ausdruck, den ich erstellt habe und der die verschiedenen Teile aus einer URL extrahiert:
^((?:https?|ftp):\/\/?)?([^:/\s.]+\.[^:/\s]|localhost)(:\d+)?((?:\/\w+)*\/)?([\w\-.]+[^#?\s]+)?([^#]+)?(#[\w-]+)?$
((?:https?|ftp):\/\/?)?
(Gruppe 1) : Extrahiert das Protokoll([^:/\s.]+\.[^:/\s]|localhost)
(Gruppe 2) : Extrahiert den Hostnamen(:\d+)?
(Gruppe 3) : Extrahiert die Portnummer((?:\/\w+)*\/)?([\w\-.]+[^#?\s]+)?
(Gruppen 4 und 5) : Extrahiert den Pfadteil([^#]+)?
(Gruppe 6) : Extrahiert den Abfrageteil(#[\w-]+)?
(Gruppe 7) : extrahiert den Hash-TeilFür jeden Teil des oben aufgeführten regulären Ausdrucks können Sie das Ende entfernen
?
, um es zu erzwingen (oder eines hinzufügen, um es fakultativ zu machen). Sie können den^
am Anfang und$
am Ende des regulären Ausdrucks auch entfernen, damit er nicht mit der gesamten Zeichenfolge übereinstimmen muss.Sehen Sie es auf regex101 .
Hinweis: Dieser reguläre Ausdruck ist nicht 100% sicher und akzeptiert möglicherweise einige Zeichenfolgen, die nicht unbedingt gültige URLs sind, überprüft jedoch tatsächlich einige Kriterien. Das Hauptziel war es, die verschiedenen Teile einer URL zu extrahieren, um sie nicht zu validieren.
quelle
Für Python ist dies die tatsächliche URL, die den in Django 1.5.1 verwendeten regulären Ausdruck überprüft:
Dies gilt sowohl für IPv4- und IPv6-Adressen als auch für Ports und GET-Parameter.
Gefunden im Code hier , Zeile 44.
quelle
Ich habe den folgenden Regex für URLs gefunden, der erfolgreich mit mehr als 500 URLs getestet wurde :
/\b(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)(?:\.(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)*(?:\.(?:[a-z\x{00a1}-\x{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?\b/gi
Ich weiß, dass es hässlich aussieht, aber das Gute ist, dass es funktioniert. :) :)
Erklärung und Demo mit 581 zufälligen URLs auf regex101.
Quelle: Auf der Suche nach dem perfekten Regex für die URL-Validierung
quelle
/(https?):\/\/([\w-]+(\.[\\w-]+)*\.([a-z]+))(([\w.,@?^=%&:\/~+#()!-]*)([\w@?^=%&\/~+#()!-]))?/gi
Ich habe versucht, meine Version der URL zu formulieren. Meine Anforderung bestand darin, Instanzen in einem String zu erfassen, in denen die URL möglichst cse.uom.ac.mu sein kann. Dabei wurde darauf hingewiesen, dass weder http noch www vorangestellt sind
quelle
ht{2}ps?
eher alshttps?
Was ist los mit schlicht und einfach FILTER_VALIDATE_URL?
Ich weiß, dass es nicht genau die Frage ist, aber es hat den Job für mich erledigt, als ich URLs validieren musste, also dachte ich, es könnte für andere nützlich sein, die auf diesen Beitrag stoßen und nach dem gleichen suchen
quelle
Das folgende RegEx funktioniert:
quelle
Verwenden Sie dieses, es funktioniert für mich
quelle
Der Einfachheit halber finden Sie hier einen einzeiligen regulären Ausdruck für URLs, der auch mit localhost übereinstimmt, bei dem Sie mit größerer Wahrscheinlichkeit Ports als
.com
oder ähnliche haben.quelle
Sie geben nicht an, welche Sprache Sie verwenden. Wenn PHP ist, gibt es dafür eine native Funktion:
Gibt die gefilterten Daten zurück oder FALSE, wenn der Filter fehlschlägt.
Überprüfen Sie es hier >>
Ich hoffe es hilft.
quelle