Polecam użycie pakietu npm psl (Public Suffix List) . „Publiczna lista sufiksów” to lista wszystkich prawidłowych sufiksów i reguł domeny, nie tylko domen najwyższego poziomu kodu kraju, ale także znaków Unicode, które można by uznać za domenę główną (tj. Www. 食 狮. 公司 .cn, bckobe .jp itp.). Przeczytaj więcej na ten temat tutaj .
Próbować:
npm install --save psl
Następnie uruchom moją implementację „extractHostname”:
let psl = require('psl');
let url = 'http://www.youtube.com/watch?v=ClkQA2Lb_iE';
psl.get(extractHostname(url)); // returns youtube.com
Nie mogę użyć pakietu npm, więc poniżej tylko testy extractHostname.
function extractHostname(url) {
var hostname;
//find & remove protocol (http, ftp, etc.) and get hostname
if (url.indexOf("//") > -1) {
hostname = url.split('/')[2];
}
else {
hostname = url.split('/')[0];
}
//find & remove port number
hostname = hostname.split(':')[0];
//find & remove "?"
hostname = hostname.split('?')[0];
return hostname;
}
//test the code
console.log("== Testing extractHostname: ==");
console.log(extractHostname("http://www.blog.classroom.me.uk/index.php"));
console.log(extractHostname("http://www.youtube.com/watch?v=ClkQA2Lb_iE"));
console.log(extractHostname("https://www.youtube.com/watch?v=ClkQA2Lb_iE"));
console.log(extractHostname("www.youtube.com/watch?v=ClkQA2Lb_iE"));
console.log(extractHostname("ftps://ftp.websitename.com/dir/file.txt"));
console.log(extractHostname("websitename.com:1234/dir/file.txt"));
console.log(extractHostname("ftps://websitename.com:1234/dir/file.txt"));
console.log(extractHostname("example.com?param=value"));
console.log(extractHostname("https://facebook.github.io/jest/"));
console.log(extractHostname("//youtube.com/watch?v=ClkQA2Lb_iE"));
console.log(extractHostname("http://localhost:4200/watch?v=ClkQA2Lb_iE"));
Niezależnie od tego, czy masz protokół, czy nawet numer portu, możesz wyodrębnić domenę. Jest to bardzo uproszczone, nieregexowe rozwiązanie, więc myślę, że tak się stanie.
* Dziękuję za @Timmerz, @renoirb, @rineez, @BigDong, @ ra00l, @ILikeBeansTacos, @CharlesRobertson za sugestie! @ ross-allen, dziękuję za zgłoszenie błędu!
url.split('/')[2]
Ponieważ niezależnie od piszemyftp
,ftps
,https
, nazwa domeny będzie zawsze na indeksie 2.return url.split('/')[2] || url.split('/')[0];
tych dopasowań, jeśli nie ma protokołu.if (domain.split('.').length > 2) { //has also subdomain var splitArr = domain.split('.'); domain = splitArr[splitArr.length - 2] + '.' + splitArr[splitArr.length - 1]; }
Zgrabna sztuczka bez użycia wyrażeń regularnych:
Zawinąć powyższe w funkcję taką jak poniżej, a masz doskonały sposób na wyrwanie części domeny z identyfikatora URI.
źródło
hostname
, nie powinien, jeśli chcesz uzyskać dostęp zarówno do, jakhostname
iport
(i uzyskać to jakodomain.sample:1234
dostępa.host
)Nie ma potrzeby analizowania łańcucha, wystarczy przekazać adres URL jako argument do
URL
konstruktora :źródło
Spróbuj tego:
Jeśli chcesz wykluczyć port z wyniku, użyj tego wyrażenia:
Edycja: aby zapobiec dopasowaniu określonych domen, użyj negatywnego spojrzenia w przyszłość.
(?!youtube.com)
źródło
?' (query) or
# (fragment). np .http://example.com?var=val
lubhttp://example.com#fragment
. Zatem poprawna regex powinny być coś takiego:/^https?\:\/\/([^\/?#]+)/
. Poza tym dostaniesz moje +1 (jest to najszybsze rozwiązanie)(?:www\.)?
w negatywnym spojrzeniu w przyszłość.(?:www\.)?
do wyrażenia regularnego w ten sposób:/^https?\:\/\/(?:www\.)?([^\/?#]+)(?:[\/?#]|$)/i
Analiza adresu URL może być trudna, ponieważ możesz mieć numery portów i znaki specjalne. Jako taki, zalecam użycie do tego czegoś takiego jak parseUri . Wątpię, czy wydajność będzie stanowić problem, chyba że analizujesz setki adresów URL.
źródło
URL()
nie jest jeszcze w pełni obsługiwany. Sprawdź: caniuse.com/#feat=urlOdpowiedź na 2020 r
Nie potrzebujesz do tego żadnych dodatkowych zależności! W zależności od tego, czy chcesz zoptymalizować wydajność, czy nie, istnieją dwa dobre rozwiązania:
Użyj
URL.hostname
dla czytelnościW erze Babel najczystszym i najłatwiejszym rozwiązaniem jest użycie
URL.hostname
.URL.hostname
jest częścią interfejsu API URL , obsługiwanego przez wszystkie główne przeglądarki oprócz IE ( caniuse ). Użyj wielopełniacza adresu URL, jeśli chcesz obsługiwać starsze przeglądarki.Korzystanie z tego rozwiązania zapewni również dostęp do innych właściwości i metod adresów URL . Będzie to przydatne, jeśli na przykład chcesz wyodrębnić nazwę ścieżki URL lub parametry ciągu zapytania .
Użyj RegEx dla wydajności
URL.hostname
jest szybszy niż użycie rozwiązania kotwicy lub parseUri . Jednak wciąż jest znacznie wolniejszy niż regex Gilly3 :Sprawdź to sam na tym jsPerf
Jeśli potrzebujesz przetworzyć bardzo dużą liczbę adresów URL (gdzie wydajność byłaby czynnikiem), zalecamy użycie tego rozwiązania. W przeciwnym razie wybierz
URL.hostname
dla czytelności.źródło
Próbowałem użyć rozwiązań podanych, Wybrany był dla mnie przesadą, a „Tworzenie elementu” dla mnie zadzierało.
Nie jest jeszcze gotowy na port w adresie URL. Mam nadzieję, że ktoś uzna to za przydatne
Uruchamianie tego:
Wynik:
źródło
Jeśli znajdziesz się na tej stronie i szukasz najlepszego REGEXU adresów URL, spróbuj tego:
https://regex101.com/r/pX5dL9/1
Działa dla adresów URL bez http: //, z http, z https, z just // i nie przechwytuj również ścieżki i ścieżki zapytania.
Powodzenia
źródło
Wszystkie właściwości adresu URL, brak zależności, brak JQuery, łatwe do zrozumienia
To rozwiązanie daje odpowiedź i dodatkowe właściwości. Nie wymaga JQuery ani innych zależności, wklej i uruchom.
Stosowanie
Wynik
Kod
Kod został zaprojektowany tak, aby był łatwy do zrozumienia, a nie bardzo szybki. Można go łatwo wywołać 100 razy na sekundę, więc świetnie nadaje się do frontonu lub kilku zastosowań serwera, ale nie do dużej przepustowości.
źródło
getUrlParts('www.google.com')
w konsoli na tej stronie.var url="https://mail.gggg.google.cn/link/link/link";
domainroot
google.com
gggg.google.cn
gggg
Wystarczy użyć konstruktora URL () :
źródło
Szukałem dziś rozwiązania tego problemu. Żadna z powyższych odpowiedzi nie wydawała się satysfakcjonująca. Chciałem rozwiązania, które mogłoby być jednowierszowe, bez logiki warunkowej i niczego, co musiałoby być zawinięte w funkcję.
Oto, co wymyśliłem, wydaje się działać naprawdę dobrze:
Na pierwszy rzut oka może wydawać się skomplikowany, ale działa dość prosto; klucz używa „slice (-n)” w kilku miejscach, w których należy wyciągnąć dobrą część z końca podzielonej tablicy (i [0], aby dostać się z przodu podzielonej tablicy).
Każdy z tych testów zwraca „example.com”:
źródło
Oto jedna linijka jQuery:
źródło
źródło
Pierwotny kredyt trafia do: http://www.primaryobjects.com/CMS/Article145
źródło
Okej, wiem, że to stare pytanie, ale zrobiłem super wydajny parser adresów URL, więc pomyślałem, że podzielę się nim.
Jak widać, struktura funkcji jest bardzo dziwna, ale pod względem wydajności. Żadne funkcje prototypowe nie są używane, ciąg nie jest iterowany więcej niż jeden raz i żaden znak nie jest przetwarzany bardziej niż to konieczne.
źródło
To nie jest pełna odpowiedź, ale poniższy kod powinien ci pomóc:
Chciałbym, żeby ktoś tworzył kod szybciej niż mój. Pomaga także poprawić siebie.
źródło
oneline z jquery
źródło
źródło
Osobiście dużo szukałem tego rozwiązania, a najlepsze, jakie mogłem znaleźć, to w rzeczywistości „sprawdzenie przeglądarki” przez CloudFlare:
Przepisałem zmienne, aby były bardziej „ludzkie”, ale spełnia to zadanie lepiej niż oczekiwano.
źródło
Cóż, używanie wyrażenia regularnego będzie o wiele łatwiejsze:
źródło
zajmuje się to zarówno protokołem.
źródło
w skrócie możesz to zrobić
Użyj powyższej funkcji, aby uzyskać nazwę domeny
źródło
?
w nazwie domeny ciąg i zamiastreturn domain.split("/")[0];
umieścić toreturn domain.split("?")[0];
nadzieja to działaParse-Urls wydaje się być biblioteką JavaScript z najbardziej niezawodnymi wzorami
Oto podsumowanie funkcji:
Rozdział 1. Normalizuj lub parsuj jeden adres URL
Rozdział 2. Wyodrębnij wszystkie adresy URL
Rozdział 3. Wyodrębnij identyfikatory URI o określonych nazwach
Rozdział 4. Wyodrębnij wszystkie rozmyte adresy URL
Rozdział 5. Podświetl wszystkie adresy URL w tekstach
Rozdział 6. Wyodrębnij wszystkie adresy URL w nieprzetworzonym HTML lub XML
źródło
Kod:
Wynik:
źródło
www.
choć nie wszystkie adresy URL zawierają ten składnik), ale z pewnością jest odpowiedzią .parsowana domena - bardzo solidna i lekka biblioteka
npm install parse-domain
Przykład 1
Przykład 2
Czemu?
W zależności od przypadku użycia i objętości zdecydowanie odradzam samodzielne rozwiązywanie tego problemu za pomocą wyrażeń regularnych lub innych metod manipulacji ciągami. Istotą tego problemu jest to, że musisz znać wszystkie sufiksy gtld i cctld, aby poprawnie parsować ciągi adresów URL w domenie i poddomenach. Sufiksy te są regularnie aktualizowane. To rozwiązany problem, a nie taki, który chcesz rozwiązać samodzielnie (chyba że jesteś google lub coś takiego). Chyba, że potrzebujesz nazwy hosta lub nazwy domeny w skrócie, nie próbuj parsować swojego wyjścia.
źródło
Mój kod wygląda tak. Wyrażenia regularne mogą przybierać różne formy, a oto moje przypadki testowe, myślę, że są bardziej skalowalne.
źródło
Wypróbuj poniższy kod, aby uzyskać dokładną nazwę domeny, używając wyrażenia regularnego,
Ciąg znaków = „ http://www.youtube.com/watch?v=ClkQA2Lb_iE ”;
źródło