Jak zauważono, idealne wyrażenie regularne jest nieuchwytne, ale nadal wydaje się rozsądnym podejściem (alternatywą są testy po stronie serwera lub nowy eksperymentalny interfejs API URL ). Jednak odpowiedzi o wysokiej pozycji często zwracają wartość false dla typowych adresów URL, ale nawet gorzej zamraża aplikację / stronę na kilka minut nawet na tak prostym ciągu jak isURL('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')
. Zostało to wskazane w niektórych komentarzach, ale najprawdopodobniej nie wprowadzono złej wartości, aby to zobaczyć. Takie zawieszenie sprawia, że ten kod nie nadaje się do użytku w żadnej poważnej aplikacji. Myślę, że jest to spowodowane powtarzającymi się zestawami bez rozróżniania wielkości liter w kodzie((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.?)+[a-z]{2,}|' ...
. Wyjmij „i” i nie zawiesza się, ale oczywiście nie będzie działać zgodnie z oczekiwaniami. Ale nawet z flagą ignorowania przypadków testy te odrzucają wysokie dopuszczalne wartości Unicode.
Najlepiej już wspomniane to:
function isURL(str) {
return /^(?:\w+:)?\/\/([^\s\.]+\.\S{2}|localhost[\:?\d]*)\S*$/.test(str);
}
To pochodzi z Github segmentio / is-url . Zaletą repozytorium kodu jest to, że można zobaczyć testy i wszelkie problemy, a także ciągi testowe przez nie przechodzące. Istnieje gałąź, która pozwalałaby na brakujące ciągi znaków google.com
, chociaż prawdopodobnie przyjmujesz wtedy zbyt wiele założeń. Repozytorium zostało zaktualizowane i nie planuję tutaj utrzymywać kopii lustrzanej. Został on podzielony na osobne testy, aby uniknąć powtórzeń RegEx, które można wykorzystać do ataków DOS (nie sądzę, że musisz się tym martwić js po stronie klienta, ale musisz martwić się o zawieszenie strony tak długo, że odwiedzający opuszcza Twoją witrynę).
Jest jeszcze jedno repozytorium, które widziałem, które może być nawet lepsze dla isURL na dperini / regex-weburl.js , ale jest bardzo złożone. Ma większą listę testową prawidłowych i nieprawidłowych adresów URL. Prosty powyżej nadal przekazuje wszystkie pozytywy i nie blokuje tylko kilku dziwnych negatywów, takich http://a.b--c.de/
jak specjalne IPS.
Niezależnie od tego, co wybierzesz, uruchom go za pomocą tej funkcji, którą zaadaptowałem z testów na dperini / regex-weburl.js, podczas korzystania z narzędzia programistycznego przeglądarki.
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"));}
A następnie przetestuj ciąg „a”.
Zobacz to porównanie wyrażenia regularnego isURL autorstwa Mathiasa Bynensa, aby uzyskać więcej informacji przed opublikowaniem pozornie doskonałego wyrażenia regularnego.
http
, domyślnie nie ma adresu URL.