Czy w JavaScript jest sposób sprawdzenia, czy ciąg znaków jest adresem URL?
RegExes są wykluczone, ponieważ adres URL jest najprawdopodobniej zapisany jak stackoverflow
; to znaczy, że może nie mieć .com
, www
lub http
.
javascript
string
url
Bruno
źródło
źródło
http
, domyślnie nie ma adresu URL.<scheme>:<scheme-specific-part>
href
element kotwiczący, działa podczas wywoływaniawindow.open(url)
, wskazuje na coś, co naprawdę istnieje, działa w lokalizacji przeglądarki pasek lub kombinacja powyższych? Uzyskasz bardzo różne odpowiedzi w zależności od tego, na czym Ci zależy.Odpowiedzi:
Powiązane pytanie z odpowiedzią:
Dopasowywanie wyrażeń regularnych JavaScript
Lub ten Regexp z Devshed :
źródło
{ title: "Stackoverflow", uri: "http://stackoverflow.com" }
Aktualizacja: rzeczywiście, zobacz code.google.com/chrome/extensions/bookmarks.htmlinvalid quantifier
. Dowolny pomysł?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 (wersja 30.0.1599.101) (Mac OS X: 10.8.5)RegExp
, musisz podwójnie uciec z ukośników odwrotnych - w przeciwnym razie otrzymasz błędy, takie jak nieprawidłowa grupa .źródło
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)
Włączyłem czajnik, poszedłem do toalety, zadzwoniłem do mamy, a sprawa została wykonana wtrue
zaaaa
.isURL('12345678901234567890123')
dodaj kilka znaków, a nawet gorzej.Możesz spróbować użyć
URL
konstruktora : jeśli nie wyrzuca, ciąg jest prawidłowym adresem URL:Termin „URL” jest zdefiniowany w RFC 3886 (jako URI); musi zaczynać się od nazwy schematu, a nazwa schematu nie ogranicza się do http / https.
Godne uwagi przykłady:
www.google.com
jest nieprawidłowy adres URL (brak schematu)javascript:void(0)
jest prawidłowym adresem URL, chociaż nie jest adresem HTTPhttp://..
jest prawidłowym adresem URL, przy czym host jest..
; to, czy zostanie rozwiązane, zależy od Twojego DNShttps://google..com
jest prawidłowym adresem URL, takim samym jak powyżejJeśli chcesz sprawdzić, czy ciąg jest prawidłowym adresem URL HTTP:
źródło
href
atrybutu dla<a>
. Prawidłowy adres URL musi zaczynać się od nazwy schematu , nphttps://
.isValidUrl("javascript:void(0)")
http://..
lubhttp:///a
Zamiast używać wyrażenia regularnego, zaleciłbym użycie elementu kotwicy.
po ustawieniu
href
właściwości ananchor
ustawiane są różne inne właściwości.źródło
Jeśli jednak wartość
href
jest powiązana z niepoprawnym adresem URL, wartością tych właściwości pomocniczych będzie pusty ciąg.Edycja: jak wskazano w komentarzach: w przypadku użycia nieprawidłowego adresu URL właściwości bieżącego adresu URL mogą zostać podstawione.
Tak długo, jak nie podajesz adresu URL bieżącej strony, możesz zrobić coś takiego:
źródło
a.href
jest nieprawidłowy,parser.host
zwraca nazwę hosta strony, na której aktualnie się znajdujesz, a nie oczekiwanąfalse
.<a href="invalidurl">
to ma iść do swojej domeny. Zostaje dodany na końcu bieżącego adresu URL. Chrome działa prawidłowo, podając bieżącą nazwę hosta z elementu „parser”.function isValidURL(str)
: o wiele lepsze niż użycie wyrażenia regularnego! Dziękuję Ci!Korzystam z poniższej funkcji do sprawdzania poprawności adresu URL z lub bez
http/https
:źródło
https://sdfasdp.ppppppppppp
tzn.true
Powraca, ale moimfalse
zdaniem oczekiwane są zwroty .[email protected]
... czy powinna? Myślę, że nie powinnoAby sprawdzić poprawność adresu URL za pomocą javascript, pokazano poniżej
źródło
(http|https)
do(?:https?)
; b):{0,1}
do:?
; c)[0-9]
do\d
Polegaj na bibliotece: https://www.npmjs.com/package/valid-url
źródło
{
Poprawa przyjętej odpowiedzi ...
Pozwala na symbol @ na ścieżce, np. Https://medium.com/@techytimo
źródło
Oto kolejna metoda.
źródło
new URL(string)
w kodzie Pavlo. Oba testy mają identyczne wyniki ze wszystkimi testowanymi przypadkami krawędzi. Podoba mi się jego kod, ponieważ jest prostszy i nie wymaga tworzenia elementów, ale twój jest kilka razy szybszy (prawdopodobnie dlatego, że nie tworzy el po pierwszym użyciu).(Nie mam powtórzeń, by komentować ValidURL przykład ; dlatego opublikuj to jako odpowiedź).
Chociaż stosowanie adresów URL względnych dla protokołu nie jest zalecane ( adres URL względny dla protokołu ), czasami się angażują. Aby zweryfikować taki adres URL za pomocą wyrażenia regularnego, część protokołu może być opcjonalna, np .:
Jak zauważyli inni, wyrażenie regularne nie wydaje się być najlepszym rozwiązaniem do sprawdzania poprawności adresów URL.
źródło
isValidURL("https://[email protected]/13176")
@
. Nie zawiesza się w moich przeglądarkach .Możesz użyć natywnego API URL :
źródło
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:
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.
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.
źródło
isURL('a'.repeat(100))
przeze mnie wyrażenie regularne może wykonać miliony razy na sekundę (bardziej złożony z dperini jest w rzeczywistości szybszy). Niektóre z wysoko postawionych odpowiedzi w formularzu ([a-zA-Z] +) * zajęłyby kilka godzin. Aby uzyskać więcej informacji, wyszukaj redos RegEx.Nie mogę komentować postu, który jest najbliższy # 5717133 , ale poniżej znajduje się sposób, w jaki wymyśliłem, jak uruchomić regex @ tom-gullen.
źródło
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');
Użyj validator.js
ES6
Brak ES6
Możesz także dostroić zachowanie tej funkcji, przekazując opcjonalny
options
obiekt jako drugi argumentisURL
Oto domyślny
options
obiekt:host_whitelist
ihost_blacklist
mogą być tablicami hostów. Obsługują również wyrażenia regularne.źródło
Jedną funkcją, której używałem do sprawdzania poprawności „ciągu” adresu URL jest:
Ta funkcja zwraca wartość logiczną, czy ciąg jest adresem URL.
Przykłady:
źródło
Jest to dość trudne w przypadku zwykłego wyrażenia regularnego, ponieważ adresy URL mają wiele „niedogodności”.
Na przykład nazwy domen mają skomplikowane ograniczenia dotyczące łączników:
za. W środku może znajdować się wiele kolejnych łączników.
b. ale pierwszy znak i ostatni znak nazwy domeny nie mogą być łącznikiem
do. Trzeci i czwarty znak nie mogą być jednocześnie łącznikiem
Podobnie numer portu może zawierać się w zakresie 1-65535. Łatwo to sprawdzić, jeśli wyodrębniasz część portu i konwertujesz na,
int
ale dość trudno jest sprawdzić za pomocą wyrażenia regularnego.Nie ma również łatwego sposobu sprawdzenia prawidłowych rozszerzeń domen. Niektóre kraje mają domeny drugiego poziomu (takie jak „co.uk”) lub rozszerzenie może być długim słowem, np. „.International”. Nowe domeny TLD są dodawane regularnie. Tego rodzaju rzeczy można sprawdzić tylko na liście zakodowanej na stałe. (patrz https://en.wikipedia.org/wiki/Top-level_domain )
Następnie są adresy URL magnesów, adresy ftp itp. Wszystkie mają różne wymagania.
Niemniej jednak, tutaj jest funkcja, która obsługuje prawie wszystko oprócz:
źródło
Myślę, że używanie natywnego interfejsu API URL jest lepsze niż złożone wzorce wyrażeń regularnych, jak sugerował @pavlo. Ma jednak pewne wady, które możemy naprawić za pomocą dodatkowego kodu. To podejście kończy się niepowodzeniem dla następującego prawidłowego adresu URL.
Możemy wcześniej dodać brakujący protokół, aby tego uniknąć. Nie wykrywa również następującego nieprawidłowego adresu URL.
Po co więc sprawdzać cały adres URL? możemy po prostu sprawdzić domenę. Pożyczyłem wyrażenie regularne, aby zweryfikować domenę stąd .
hostname
Atrybut jest pusty ciąg dlajavascript:void(0)
, tak to działa na to zbyt, można również dodać adres IP weryfikator też. Chciałbym trzymać się najbardziej natywnego API i mam nadzieję, że zacznie on obsługiwać wszystko w najbliższej przyszłości.źródło
new URL
nie ma w testach, które przeprowadziłem. To się nazywa:http://142.42.1.1 //false
i blokuje wysokie ciągi Unicode.Pytanie wymaga metody sprawdzania adresu URL, na przykład
stackoverflow
bez protokołu lub kropki w nazwie hosta. Tak więc nie jest to kwestia sprawdzania poprawności adresu URL sintax, ale sprawdzenie, czy jest to prawidłowy adres URL, przez jego wywołanie.Próbowałem kilku metod, aby dowiedzieć się, czy adres URL true istnieje i można wywołać go z poziomu przeglądarki, ale nie znalazłem żadnego sposobu na przetestowanie za pomocą javascript nagłówka odpowiedzi wywołania:
click()
metody.'GET'
jest w porządku, ale ma różne ograniczenia ze względu naCORS
zasady i nie jest tak w przypadku używaniaajax
, ponieważ jako adres URL może być dowolny poza domeną mojego serwera.https
protokołem i zgłasza wyjątek podczas wywoływania niezabezpieczonych adresów URL.Tak więc najlepszym rozwiązaniem, jakie mogę wymyślić, jest uzyskanie jakiegoś narzędzia do wykonania
CURL
za pomocą javascript próbującego czegoś takiegocurl -I <url>
. Niestety nie znalazłem żadnego, a z wyglądu nie jest to możliwe. Będę wdzięczny za wszelkie komentarze na ten temat.Ale w końcu mam uruchomiony serwer
PHP
i ponieważ używam Ajax do prawie wszystkich moich żądań, napisałem funkcję po stronie serwera, aby wykonać tam żądanie curl i wrócić do przeglądarki.Odnośnie do pojedynczego słowa url w pytaniu „stackoverflow” doprowadzi mnie do
https://daniserver.com.ar/stackoverflow
, gdzie daniserver.com.ar to moja własna domena.źródło
foo
i założyć, że jest to http, https, .com lub .es lub którykolwiek z niezliczonych przyrostków? Czy rzucasz w nią zlewem kuchennym, dopóki nie osiągniesz prawdy?To wydaje się być jednym z najtrudniejszych problemów w CS;)
Oto inne niepełne rozwiązanie, które działa wystarczająco dobrze dla mnie i lepiej niż inne, które tu widziałem. Korzystam z danych wejściowych [type = url] w celu obsługi IE11, w przeciwnym razie byłoby znacznie prostsze przy użyciu window.URL, aby zamiast tego wykonać sprawdzenie poprawności:
Aby zaakceptować niekompletne dane wejściowe, takie jak „www.moja_domena.com”, spowoduje to również, że będzie on prawidłowy, zakładając, że w tych przypadkach protokół ma wartość „http”, i zwróci prawidłowy adres URL, jeśli adres jest prawidłowy. Zwraca false, gdy jest nieprawidłowy.
Obsługuje także domeny IPv4, ale nie obsługuje IPv6.
źródło
W moim przypadku moim jedynym wymaganiem jest to, aby dane wejściowe użytkownika nie były interpretowane jako link względny po umieszczeniu w href tagu, a odpowiedzi tutaj były albo trochę OTT dla tego lub dozwolone adresy URL niespełniające moich wymagań, więc to z tym idę:
To samo można osiągnąć dość łatwo bez wyrażenia regularnego.
źródło
to działa ze mną
źródło
Jeśli możesz zmienić typ danych wejściowych, myślę, że to rozwiązanie byłoby znacznie łatwiejsze:
Możesz w prosty sposób użyć
type="url"
danych wejściowych i sprawdzić je za pomocącheckValidity()
jsNa przykład:
twoja.html
twoja.js
źródło
To zdecydowanie nie jest najskuteczniejsze podejście, ale jest czytelne i łatwe do sformułowania według potrzeb. Łatwiej jest stąd dodać wyrażenie regularne / złożoność. Oto bardzo pragmatyczne podejście
TEST:
źródło
Mathias Bynens opracował listę znanych wyrażeń regularnych adresów URL z URL testowych. Nie ma powodu, aby pisać nowe wyrażenie regularne; wybierz istniejący, który najbardziej Ci odpowiada.
Ale tabela porównawcza dla tych wyrażeń regularnych pokazuje również, że sprawdzenie poprawności adresu URL za pomocą pojedynczego wyrażenia regularnego jest prawie niemożliwe. Wszystkie wyrażenia regularne na liście Bynensa produkują fałszywie pozytywne i fałszywe negatywy.
Sugeruję użycie istniejącego parsera adresów URL (na przykład
new URL('http://www.example.com/')
w JavaScript), a następnie zastosowanie sprawdzeń, które chcesz wykonać, względem przeanalizowanej i znormalizowanej formy adresu URL lub. jego składniki. Korzystanie zURL
interfejsu JavaScript ma tę dodatkową zaletę, że akceptuje tylko takie adresy URL, które są naprawdę akceptowane przez przeglądarkę.Należy również pamiętać, że technicznie niepoprawne adresy URL mogą nadal działać. Na przykład
http://w_w_w.example.com/
,http://www..example.com/
,http://123.example.com/
mają nieprawidłową część hosta ale każda przeglądarka wiem spróbuje otworzyć je bez zarzutów, a kiedy określenia adresów IP dla tych nieprawidłowych nazw w/etc/hosts/
tych adresów URL będzie jeszcze działać, ale tylko na komputerze.Dlatego nie chodzi o to, czy adres URL jest prawidłowy, ale o to, które adresy URL działają i powinny być dozwolone w określonym kontekście.
Jeśli chcesz przeprowadzić weryfikację adresu URL, istnieje wiele szczegółów i przypadków, które można łatwo przeoczyć:
http://user:[email protected]/
.http://www.stackoverflow.com.
).[-0-9a-zA-z]
pewno nie jest już wystarczający.co.uk
i wiele innych).Które z tych ograniczeń i zasad mają zastosowanie, jest kwestią wymagań i gustu projektu.
Niedawno napisałem walidator URL dla aplikacji internetowej, która jest odpowiednia dla adresów URL dostarczanych przez użytkowników na forach, sieciach społecznościowych i tym podobnych. Możesz go używać jako podstawy własnego:
Napisałem również wpis na blogu The Gory Details of URL Validation z bardziej szczegółowymi informacjami.
źródło
Zmieniam funkcję na Dopasuj + dokonuję tutaj zmiany za pomocą ukośników i jej działania: (http: // i https) oba
źródło
Oto tylko bardzo prosta kontrola, aby upewnić się, że istnieje prawidłowy protokół, a rozszerzenie domeny musi składać się z dwóch lub więcej znaków.
źródło
Jeśli potrzebujesz także obsługiwać,
https://localhost:3000
użyj tej zmodyfikowanej wersji wyrażenia regularnego [Devshed].źródło
Istnieje kilka testów z użyciem konstruktora URL, które nie określają, czy dane wejściowe są ciągiem czy obiektem URL.
źródło
Aktualizacja 2020. Aby rozwinąć zarówno doskonałą odpowiedź z @iamnewton i @Fernando Chavez Herrera, zacząłem widzieć,
@
że są używane na ścieżce adresów URL.Zaktualizowany wyrażenie regularne to:
Jeśli chcesz zezwolić na to w ciągu zapytania i skrócie, użyj:
Biorąc to pod uwagę, nie jestem pewien, czy
@
w łańcuchu zapytania lub haszu istnieje reguła białej księgi.źródło
Jest już wiele odpowiedzi, ale oto kolejny wkład: zaczerpnięty bezpośrednio z
URL
kontroli poprawności wypełniania, użyjinput
elementu,type="url"
aby skorzystać z wbudowanej kontroli poprawności przeglądarki:Źródło
źródło