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:
function isURL(str) {
return /^(?:\w+:)?\/\/([^\s\.]+\.\S{2}|localhost[\:?\d]*)\S*$/.test(str);
}
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.
function testIsURL() {
//should match
console.assert(isURL("http://foo.com/blah_blah"));
console.assert(isURL("http://foo.com/blah_blah/"));
console.assert(isURL("http://foo.com/blah_blah_(wikipedia)"));
console.assert(isURL("http://foo.com/blah_blah_(wikipedia)_(again)"));
console.assert(isURL("http://www.example.com/wpstyle/?p=364"));
console.assert(isURL("https://www.example.com/foo/?bar=baz&inga=42&quux"));
console.assert(isURL("http://✪df.ws/123"));
console.assert(isURL("http://userid:password@example.com:8080"));
console.assert(isURL("http://userid:password@example.com:8080/"));
console.assert(isURL("http://userid@example.com"));
console.assert(isURL("http://userid@example.com/"));
console.assert(isURL("http://userid@example.com:8080"));
console.assert(isURL("http://userid@example.com:8080/"));
console.assert(isURL("http://userid:password@example.com"));
console.assert(isURL("http://userid:password@example.com/"));
console.assert(isURL("http://142.42.1.1/"));
console.assert(isURL("http://142.42.1.1:8080/"));
console.assert(isURL("http://➡.ws/䨹"));
console.assert(isURL("http://⌘.ws"));
console.assert(isURL("http://⌘.ws/"));
console.assert(isURL("http://foo.com/blah_(wikipedia)#cite-1"));
console.assert(isURL("http://foo.com/blah_(wikipedia)_blah#cite-1"));
console.assert(isURL("http://foo.com/unicode_(✪)_in_parens"));
console.assert(isURL("http://foo.com/(something)?after=parens"));
console.assert(isURL("http://☺.damowmow.com/"));
console.assert(isURL("http://code.google.com/events/#&product=browser"));
console.assert(isURL("http://j.mp"));
console.assert(isURL("ftp://foo.bar/baz"));
console.assert(isURL("http://foo.bar/?q=Test%20URL-encoded%20stuff"));
console.assert(isURL("http://مثال.إختبار"));
console.assert(isURL("http://例子.测试"));
console.assert(isURL("http://उदाहरण.परीक्षा"));
console.assert(isURL("http://-.~_!$&'()*+,;=:%40:80%2f::::::@example.com"));
console.assert(isURL("http://1337.net"));
console.assert(isURL("http://a.b-c.de"));
console.assert(isURL("http://223.255.255.254"));
console.assert(isURL("postgres://u:p@example.com:5702/db"));
console.assert(isURL("https://d1f4470da51b49289906b3d6cbd65074@app.getsentry.com/13176"));
//SHOULD NOT MATCH:
console.assert(!isURL("http://"));
console.assert(!isURL("http://."));
console.assert(!isURL("http://.."));
console.assert(!isURL("http://../"));
console.assert(!isURL("http://?"));
console.assert(!isURL("http://??"));
console.assert(!isURL("http://??/"));
console.assert(!isURL("http://#"));
console.assert(!isURL("http://##"));
console.assert(!isURL("http://##/"));
console.assert(!isURL("http://foo.bar?q=Spaces should be encoded"));
console.assert(!isURL("//"));
console.assert(!isURL("//a"));
console.assert(!isURL("///a"));
console.assert(!isURL("///"));
console.assert(!isURL("http:///a"));
console.assert(!isURL("foo.com"));
console.assert(!isURL("rdar://1234"));
console.assert(!isURL("h://test"));
console.assert(!isURL("http:// shouldfail.com"));
console.assert(!isURL(":// should fail"));
console.assert(!isURL("http://foo.bar/foo(bar)baz quux"));
console.assert(!isURL("ftps://foo.bar/"));
console.assert(!isURL("http://-error-.invalid/"));
console.assert(!isURL("http://a.b--c.de/"));
console.assert(!isURL("http://-a.b.co"));
console.assert(!isURL("http://a.b-.co"));
console.assert(!isURL("http://0.0.0.0"));
console.assert(!isURL("http://10.1.1.0"));
console.assert(!isURL("http://10.1.1.255"));
console.assert(!isURL("http://224.1.1.1"));
console.assert(!isURL("http://1.1.1.1.1"));
console.assert(!isURL("http://123.123.123"));
console.assert(!isURL("http://3628126748"));
console.assert(!isURL("http://.www.foo.bar/"));
console.assert(!isURL("http://www.foo.bar./"));
console.assert(!isURL("http://.www.foo.bar./"));
console.assert(!isURL("http://10.1.1.1"));}
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.
http
, ist es standardmäßig keine URL.