Gibt es in JavaScript eine Möglichkeit zu überprüfen, ob eine Zeichenfolge eine URL ist?
RegExes werden ausgeschlossen, da die URL höchstwahrscheinlich wie folgt geschrieben ist stackoverflow
. das heißt , dass es nicht haben könnte .com
, www
oder http
.
javascript
string
url
Bruno
quelle
quelle
http
, ist es standardmäßig keine URL.<scheme>:<scheme-specific-part>
href
in einem Ankerelement analysiert wird , beim Aufrufen funktioniertwindow.open(url)
, auf etwas verweist, das wirklich vorhanden ist, am Browser funktioniert Bar oder eine Kombination der oben genannten? Sie erhalten sehr unterschiedliche Antworten, je nachdem, welche davon Ihnen wichtig sind.Antworten:
Eine verwandte Frage mit einer Antwort:
Übereinstimmende Javascript-Regex-URL
Oder dieser Regexp von Devshed :
quelle
{ title: "Stackoverflow", uri: "http://stackoverflow.com" }
Update: siehe code.google.com/chrome/extensions/bookmarks.htmlinvalid quantifier
. Irgendeine Idee?SyntaxError: Invalid regular expression: /^(https?://)?((([a-zd]([a-zd-]*[a-zd])*).)+[a-z]{2,}|((d{1,3}.){3}d{1,3}))(:d+)?(/[-a-zd%_.~+]*)*(?[;&a-zd%_.~+=-]*)?(#[-a-zd_]*)?$/: Invalid group
Google Chrome (Version 30.0.1599.101) (Mac OS X: 10.8.5)RegExp
die Backslashes doppelt maskieren müssen , wenn Sie eine Zeichenfolge als Parameter für das verwenden. Andernfalls werden Fehler wie eine ungültige Gruppe angezeigt .quelle
http://www.google.com/url?sa=i&rct=j&q=&esrc=s&source=images&cd=&docid=nIv5rk2GyP3hXM&tbnid=isiOkMe3nCtexM:&ved=0CAUQjRw&url=http%3A%2F%2Fanimalcrossing.wikia.com%2Fwiki%2FLion&ei=ygZXU_2fGKbMsQTf4YLgAQ&bvm=bv.65177938,d.aWc&psig=AFQjCNEpBfKnal9kU7Zu4n7RnEt2nerN4g&ust=1398298682009707
start = new Date(); isURL("http://michalstefanow.com"); end = new Date(); diff = end - start; console.log(diff)
Ich stellte einen Wasserkocher auf, ging auf eine Toilette, rief meine Mutter an und die Sache war in kürzester Zeit erledigt ...true
füraaa
.isURL('12345678901234567890123')
Fügen Sie weitere Zeichen hinzu und es ist noch schlimmer.Sie können versuchen, den
URL
Konstruktor zu verwenden : Wenn er nicht ausgelöst wird, ist die Zeichenfolge eine gültige URL:Der Begriff 'URL' ist in RFC 3886 (als URI) definiert. Es muss mit einem Schemanamen beginnen, und der Schemaname ist nicht auf http / https beschränkt.
Bemerkenswerte Beispiele:
www.google.com
ist keine gültige URL (fehlendes Schema)javascript:void(0)
ist eine gültige URL, jedoch keine HTTP-URLhttp://..
ist eine gültige URL, wobei der Host ist..
; Ob es aufgelöst wird, hängt von Ihrem DNS abhttps://google..com
ist eine gültige URL wie obenWenn Sie überprüfen möchten, ob eine Zeichenfolge eine gültige HTTP-URL ist:
quelle
href
Attribut für verwenden<a>
. Eine gültige URL muss mit einem Schemanamen beginnen , zhttps://
.isValidUrl("javascript:void(0)")
http://..
Oderhttp:///a
Anstatt einen regulären Ausdruck zu verwenden, würde ich empfehlen, ein Ankerelement zu verwenden.
Wenn Sie die
href
Eigenschaft von festlegenanchor
, werden verschiedene andere Eigenschaften festgelegt.Quelle
Wenn der
href
gebundene Wert jedoch keine gültige URL ist, ist der Wert dieser Hilfseigenschaften die leere Zeichenfolge.Bearbeiten: Wie in den Kommentaren ausgeführt: Wenn eine ungültige URL verwendet wird, können die Eigenschaften der aktuellen URL ersetzt werden.
Solange Sie die URL der aktuellen Seite nicht übergeben, können Sie Folgendes tun:
quelle
a.href
ungültig ist, wirdparser.host
der Hostname der Seite zurückgegeben, auf der Sie sich gerade befinden, nicht der erwartetefalse
.<a href="invalidurl">
es sich auf Ihre Domain gehen. Es wird am Ende der aktuellen URL hinzugefügt. Chrome macht also das Richtige, indem es Ihnen den aktuellen Hostnamen aus dem "Parser" -Element gibt.function isValidURL(str)
: so viel besser als Regex! Danke dir!Ich verwende die folgende Funktion, um die URL mit oder ohne zu validieren
http/https
:quelle
https://sdfasdp.ppppppppppp
dh Sie kehren zurück,true
aber meine kehrt zurück,false
was meiner Meinung nach erwartet wird.[email protected]
... sollte es? Ich denke, es sollte nichtDas Überprüfen von URL mit Javascript wird unten gezeigt
quelle
(http|https)
auf(?:https?)
; b):{0,1}
zu:?
; c)[0-9]
bis\d
Verlassen Sie sich auf eine Bibliothek: https://www.npmjs.com/package/valid-url
quelle
{
Verbesserung der akzeptierten Antwort ...
Ermöglicht das @ -Symbol im Pfad, z. B. https://medium.com/@techytimo
quelle
Hier ist noch eine andere Methode.
quelle
new URL(string)
von Pavlos Code. Beide Tests haben identische Ergebnisse mit allen von mir getesteten Randfällen. Ich mag seinen Code, weil er einfacher ist und keine Elemente erstellt, aber Ihr Code ist ein paar Mal schneller (wahrscheinlich, weil er das el nach der ersten Verwendung nicht erstellt).(Ich habe keine Mitarbeiter, die das ValidURL- Beispiel kommentieren könnten. Schreiben Sie dies daher als Antwort.)
Die Verwendung protokollbezogener URLs wird zwar nicht empfohlen ( protokollbezogene URL ), sie werden jedoch manchmal verwendet. Um eine solche URL mit einem regulären Ausdruck zu validieren, kann der Protokollteil optional sein, z.
Wie andere angemerkt haben, scheint der reguläre Ausdruck jedoch nicht der am besten geeignete Ansatz für die Validierung von URLs zu sein.
quelle
isValidURL("https://[email protected]/13176")
@
. Es hängt nicht in meinen Browsern .Sie können die native URL-API verwenden :
quelle
Wie bereits erwähnt, ist der perfekte reguläre Ausdruck schwer fassbar, scheint aber dennoch ein vernünftiger Ansatz zu sein (Alternativen sind serverseitige Tests oder die neue experimentelle URL-API ). Die hochrangigen Antworten geben jedoch häufig häufig verwendete URLs für häufig verwendete URLs zurück. Schlimmer noch, Ihre App / Seite wird für Minuten eingefroren, selbst wenn es sich um eine so einfache Zeichenfolge wie handelt
isURL('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')
. In einigen Kommentaren wurde darauf hingewiesen, aber höchstwahrscheinlich wurde kein schlechter Wert eingegeben, um ihn anzuzeigen. Wenn Sie so hängen, wird dieser Code in jeder ernsthaften Anwendung unbrauchbar. Ich denke, es liegt an der wiederholten Groß- und Kleinschreibung ohne Berücksichtigung von Codes im Code wie((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.?)+[a-z]{2,}|' ...
. Nehmen Sie das 'i' heraus und es hängt nicht, funktioniert aber natürlich nicht wie gewünscht. Aber selbst mit dem Flag "Fall ignorieren" lehnen diese Tests hohe Unicode-Werte ab, die zulässig sind.Das Beste, was bereits erwähnt wurde, ist:
Das kommt von Github segmentio / is-url . Das Gute an einem Code-Repository ist, dass Sie die Tests und alle Probleme sowie die durchlaufenden Testzeichenfolgen sehen können. Es gibt einen Zweig, in dem Zeichenfolgen ohne Protokoll fehlen
google.com
, obwohl Sie dann wahrscheinlich zu viele Annahmen treffen. Das Repository wurde aktualisiert und ich habe nicht vor, hier einen Spiegel aufrechtzuerhalten. Es wurde in separate Tests unterteilt, um RegEx- Redos zu vermeiden , die für DOS-Angriffe ausgenutzt werden können (ich glaube nicht, dass Sie sich bei clientseitigen js darum kümmern müssen, aber Sie müssen sich Sorgen machen, dass Ihre Seite so lange hängt, bis Ihre Besucher verlässt Ihre Website).Es gibt ein anderes Repository, das ich gesehen habe und das für isURL unter dperini / regex-weburl.js vielleicht sogar besser ist , aber es ist sehr komplex. Es hat eine größere Testliste mit gültigen und ungültigen URLs. Das einfache oben übergibt immer noch alle positiven und blockiert nur ein paar ungerade Negative wie
http://a.b--c.de/
sowie die speziellen ips nicht.Führen Sie diese Funktion aus, die ich aus den Tests auf dperini / regex-weburl.js angepasst habe, und verwenden Sie dabei den Developer Tools Inpector Ihres Browsers.
Und dann testen Sie diese Zeichenfolge von 'a'.
Weitere Informationen finden Sie in diesem Vergleich von isURL-Regex von Mathias Bynens, bevor Sie einen scheinbar großartigen Regex veröffentlichen.
quelle
isURL('a'.repeat(100))
regulären Ausdrücke können millionenfach pro Sekunde ausgeführt werden (der komplexere von dperini ist tatsächlich schneller). Einige der hochrangigen Antworten des Formulars ([a-zA-Z] +) * würden Stunden brauchen, um dies einmal auszufüllen. Weitere Informationen finden Sie unter RegEx-Redos.Ich kann den Beitrag mit der nächstgelegenen Nummer 5717133 nicht kommentieren , aber unten ist die Art und Weise, wie ich herausgefunden habe, wie @ tom-gullen regex funktioniert.
quelle
var pattern = new RegExp('(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$', 'i');
Verwenden Sie validator.js
ES6
Nein ES6
Sie können das Verhalten dieser Funktion auch optimieren, indem Sie ein optionales
options
Objekt als zweites Argument von übergebenisURL
Hier ist das Standardobjekt
options
:host_whitelist
undhost_blacklist
kann Arrays von Hosts sein. Sie unterstützen auch reguläre Ausdrücke.quelle
Eine Funktion, mit der ich eine URL "Zeichenfolge" überprüft habe, ist:
Diese Funktion gibt einen Booleschen Wert zurück, unabhängig davon, ob es sich bei der Zeichenfolge um eine URL handelt.
Beispiele:
quelle
Dies ist mit reinem regulären Ausdruck ziemlich schwierig, da URLs viele "Unannehmlichkeiten" aufweisen.
Zum Beispiel haben Domain-Namen komplizierte Einschränkungen für Bindestriche:
ein. Es ist erlaubt, viele aufeinanderfolgende Bindestriche in der Mitte zu haben.
b. Das erste und letzte Zeichen des Domainnamens darf jedoch kein Bindestrich sein
c. Das 3. und 4. Zeichen können nicht beide Bindestriche sein
Ebenso kann die Portnummer nur im Bereich von 1-65535 liegen. Dies ist leicht zu überprüfen, ob Sie den Port-Teil extrahieren und in konvertieren,
int
aber mit einem regulären Ausdruck nur schwer zu überprüfen.Es gibt auch keine einfache Möglichkeit, gültige Domain-Endungen zu überprüfen. Einige Länder haben Domänen der zweiten Ebene (z. B. "co.uk"), oder die Erweiterung kann ein langes Wort wie ".international" sein. Und regelmäßig werden neue TLDs hinzugefügt. Diese Art von Dingen kann nur anhand einer fest codierten Liste überprüft werden. (siehe https://en.wikipedia.org/wiki/Top-level_domain )
Dann gibt es Magnet-URLs, FTP-Adressen usw. Diese haben alle unterschiedliche Anforderungen.
Trotzdem ist hier eine Funktion, die so ziemlich alles handhabt, außer:
quelle
Ich denke, die Verwendung der nativen URL-API ist besser als ein komplexes Regex-Muster, wie @pavlo vorgeschlagen hat. Es hat jedoch einige Nachteile, die wir durch zusätzlichen Code beheben können. Dieser Ansatz schlägt für die folgende gültige URL fehl.
Wir können das fehlende Protokoll vorher hinzufügen, um dies zu vermeiden. Die folgende ungültige URL wird ebenfalls nicht erkannt.
Warum also die ganze URL überprüfen? Wir können nur die Domain überprüfen. Ich habe den regulären Ausdruck ausgeliehen, um die Domain von hier aus zu überprüfen .
Das
hostname
Attribut ist eine leere Zeichenfolge fürjavascript:void(0)
, daher funktioniert es auch dafür, und Sie können auch eine IP-Adressüberprüfung hinzufügen. Ich möchte mich am liebsten an die native API halten und hoffe, dass sie in naher Zukunft alles unterstützt.quelle
new URL
die in den von mir durchgeführten Tests nicht vorhanden sind. Dies ruft auf:http://142.42.1.1 //false
und blockiert hohe Unicode-Zeichenfolgen.Die Frage fragt nach einer Validierungsmethode für eine URL wie
stackoverflow
ohne das Protokoll oder einen Punkt im Hostnamen. Es geht also nicht darum, die URL-Sintax zu validieren, sondern zu überprüfen, ob es sich um eine gültige URL handelt, indem Sie sie tatsächlich aufrufen.Ich habe verschiedene Methoden ausprobiert, um festzustellen, ob die URL true vorhanden ist und über den Browser aufgerufen werden kann, habe jedoch keine Möglichkeit gefunden, den Antwortheader des Aufrufs mit Javascript zu testen:
click()
Methode in Ordnung .'GET'
ist in Ordnung, hat jedoch aufgrund vonCORS
Richtlinien verschiedene Einschränkungen und wird nicht verwendetajax
, da die URL möglicherweise außerhalb der Domäne meines Servers liegt.https
Protokoll habe und beim Aufrufen nicht sicherer URLs eine Ausnahme auslöst.Die beste Lösung, die ich mir
CURL
vorstellen kann, ist es, ein Tool mit Javascript zu erstellen, das so etwas versuchtcurl -I <url>
. Leider habe ich keine gefunden und anscheinend ist dies nicht möglich. Ich freue mich über Kommentare dazu.PHP
Am Ende läuft jedoch ein Server, und da ich Ajax für fast alle meine Anforderungen verwende, habe ich auf der Serverseite eine Funktion geschrieben, um die Curl-Anforderung dort auszuführen und zum Browser zurückzukehren.In Bezug auf die URL mit einem einzelnen Wort in der Frage "Stackoverflow" werde ich dahin führen
https://daniserver.com.ar/stackoverflow
, wo daniserver.com.ar meine eigene Domain ist.quelle
foo
annehmen, dass es sich um http oder https oder .com oder .es oder eines der unzähligen Suffixe handelt? Wirfst du das Spülbecken weiter darauf, bis du ein wahres bekommst?Dies scheint eines der schwierigsten Probleme in CS zu sein;)
Hier ist eine weitere unvollständige Lösung, die für mich gut genug und besser funktioniert als die anderen, die ich hier gesehen habe. Ich verwende hierfür eine Eingabe [type = url], um IE11 zu unterstützen, andernfalls wäre es viel einfacher, stattdessen window.URL zu verwenden, um die Validierung durchzuführen:
Um unvollständige Eingaben wie "www.mydomain.com" zu akzeptieren, wird es auch gültig, vorausgesetzt, das Protokoll ist in diesen Fällen "http" und die gültige URL wird zurückgegeben, wenn die Adresse gültig ist. Es gibt false zurück, wenn es ungültig ist.
Es unterstützt auch IPv4-Domänen, jedoch nicht IPv6.
quelle
In meinem Fall besteht meine einzige Anforderung darin, dass die Benutzereingabe nicht als relativer Link interpretiert wird, wenn sie in die href eines Tags eingefügt wird, und die Antworten hier waren entweder ein bisschen OTT dafür oder erlaubten URLs, die meinen Anforderungen nicht entsprechen ist was ich gehe mit:
Das gleiche könnte ziemlich einfach ohne Regex erreicht werden.
quelle
das arbeitet mit mir
quelle
Wenn Sie den Eingabetyp ändern können, wäre diese Lösung meiner Meinung nach viel einfacher:
Sie können
type="url"
Ihre Eingabe einfach verwenden und mit überprüfencheckValidity()
in js überprüfenZ.B:
your.html
your.js
quelle
Dies ist trotzig nicht der effektivste Ansatz, aber es ist lesbar und einfach zu formen, was immer Sie brauchen. Und von hier aus ist es einfacher, Regex / Komplexität hinzuzufügen. Hier ist also ein sehr pragmatischer Ansatz
PRÜFUNG:
quelle
Mathias Bynens hat eine Liste bekannter URL-Regexe zusammengestellt mit Test-URLs zusammengestellt. Es gibt wenig Grund, einen neuen regulären Ausdruck zu schreiben. Wählen Sie einfach eine vorhandene aus, die am besten zu Ihnen passt.
Die Vergleichstabelle für diese regulären Ausdrücke zeigt jedoch auch, dass es nahezu unmöglich ist, eine URL-Validierung mit einem einzelnen regulären Ausdruck durchzuführen. Alle regulären Ausdrücke in Bynens 'Liste erzeugen falsch positive und falsch negative Ergebnisse.
Ich schlage vor, dass Sie einen vorhandenen URL-Parser (z. B.
new URL('http://www.example.com/')
in JavaScript) verwenden und dann die Überprüfungen, die Sie durchführen möchten, auf die analysierte und normalisierte Form der URL bzw. anwenden. seine Komponenten. Die Verwendung der JavaScript-URL
Oberfläche hat den zusätzlichen Vorteil, dass nur solche URLs akzeptiert werden, die vom Browser wirklich akzeptiert werden.Beachten Sie auch, dass möglicherweise technisch inkorrekte URLs weiterhin funktionieren. Zum Beispiel
http://w_w_w.example.com/
,http://www..example.com/
,http://123.example.com/
haben alle einen ungültigen Hostnamen Teil aber jeder Browser weiß ich wird versuchen , sie ohne Beschwerden zu öffnen, und wenn Sie die IP - Adressen für die ungültigen Namen angeben , in/etc/hosts/
solche URLs werden auch funktionieren , aber nur auf dem Computer.Die Frage ist daher nicht so sehr, ob eine URL gültig ist, sondern welche URLs funktionieren und in einem bestimmten Kontext zugelassen werden sollten.
Wenn Sie eine URL-Validierung durchführen möchten, gibt es viele Details und Randfälle, die leicht übersehen werden können:
http://user:[email protected]/
.http://www.stackoverflow.com.
).[-0-9a-zA-z]
definitiv nicht mehr ausreicht.co.uk
und viele andere).Welche dieser Einschränkungen und Regeln gelten, hängt von den Projektanforderungen und dem Geschmack ab.
Ich habe kürzlich einen URL-Validator für eine Web-App geschrieben, der für vom Benutzer bereitgestellte URLs in Foren, sozialen Netzwerken oder dergleichen geeignet ist. Fühlen Sie sich frei, es als Basis für Ihre eigene zu verwenden:
Ich habe auch einen Blog-Beitrag The Gory Details of URL Validation mit detaillierteren Informationen geschrieben.
quelle
Ich ändere die Funktion in Match + und nehme hier eine Änderung mit den Schrägstrichen und ihrer Arbeit vor: (http: // und https) beide
quelle
Hier ist nur eine sehr einfache Überprüfung, um sicherzustellen, dass ein gültiges Protokoll vorhanden ist und die Domänenerweiterung aus zwei oder mehr Zeichen bestehen muss.
quelle
Wenn Sie auch Unterstützung benötigen,
https://localhost:3000
verwenden Sie diese modifizierte Version des regulären Ausdrucks von [Devshed].quelle
Es gibt einige Tests mit dem URL-Konstruktor, bei denen nicht festgelegt wird, ob es sich bei der Eingabe um eine Zeichenfolge oder ein URL-Objekt handelt.
quelle
2020 Update. Um sowohl die exzellenten Antworten von @iamnewton als auch von @Fernando Chavez Herrera zu erweitern, habe ich begonnen, zu sehen
@
, wie sie im Pfad von URLs verwendet werden.Der aktualisierte reguläre Ausdruck lautet also:
Wenn Sie es in der Abfragezeichenfolge und im Hash zulassen möchten, verwenden Sie:
Davon abgesehen bin ich mir nicht sicher, ob die Abfragezeichenfolge
@
oder der Hash eine Whitepaper-Regel nicht zulässt.quelle
Es gibt bereits viele Antworten, aber hier ist ein weiterer Beitrag:
URL
Verwenden Sie direkt aus der Polyfill-Gültigkeitsprüfung eininput
Element mittype="url"
, um die integrierte Gültigkeitsprüfung des Browsers zu nutzen:Quelle
quelle