Czy ktoś zna wyrażenie regularne, którego mógłbym użyć do znalezienia adresów URL w ciągu znaków? Znalazłem w Google wiele wyrażeń regularnych do określania, czy cały ciąg jest adresem URL, ale muszę mieć możliwość przeszukiwania całego ciągu w poszukiwaniu adresów URL. Na przykład chciałbym móc znaleźć www.google.com
i http://yahoo.com
w następującym ciągu:
Hello www.google.com World http://yahoo.com
Nie szukam konkretnych adresów URL w ciągu. Szukam WSZYSTKICH adresów URL w ciągu, dlatego potrzebuję wyrażenia regularnego.
Odpowiedzi:
To jest ten, którego używam
U mnie działa, u ciebie też powinno działać.
źródło
\w
może nie odpowiadać symboli międzynarodowych (w zależności od silnika regex), zakres konieczna jest zamiast:a-zA-Z0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF
.[\w_-]
być[\w-]
? ponieważ już\w
pasuje_
. per mozilla docswww.yahoo.com
."""(http|ftp|https)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?""".r.findAllIn("www.google.com").toList
. TAKŻE BRAKUJE WYJAŚNIENIA odpowiedziChyba żadne wyrażenie regularne nie jest idealne do tego zastosowania. Znalazłem całkiem solidne jeden tutaj
Niektóre różnice / zalety w porównaniu z innymi zamieszczonymi tutaj:
moo.com
bezhttp
lubwww
Zobacz tutaj przykłady
źródło
g
opcja nie jest prawidłowa we wszystkich implementacjach wyrażeń regularnych (np. We wbudowanej implementacji Rubiego).text = """The link of this question: /programming/6038061/regular-expression-to-find-urls-within-a-string Also there are some urls: www.google.com, facebook.com, http://test.com/method?param=wasd The code below catches all urls in text and returns urls in list.""" urls = re.findall('(?:(?:https?|ftp):\/\/)?[\w/\-?=%.]+\.[\w/\-?=%.]+', text) print(urls)
Wynik:
[ '/programming/6038061/regular-expression-to-find-urls-within-a-string', 'www.google.com', 'facebook.com', 'http://test.com/method?param=wasd' ]
źródło
&
parametrów w adresie URL. np.http://test.com/method?param=wasd¶m2=wasd2
brakuje param2Żadne z przedstawionych tutaj rozwiązań nie rozwiązało problemów / przypadków użycia, które miałem.
To, co tu podałem, jest najlepsze, jakie do tej pory znalazłem / wykonałem. Zaktualizuję go, gdy znajdę nowe przypadki skrajne, z którymi nie radzi sobie.
\b #Word cannot begin with special characters (?<![@.,%&#-]) #Protocols are optional, but take them with us if they are present (?<protocol>\w{2,10}:\/\/)? #Domains have to be of a length of 1 chars or greater ((?:\w|\&\#\d{1,5};)[.-]?)+ #The domain ending has to be between 2 to 15 characters (\.([a-z]{2,15}) #If no domain ending we want a port, only if a protocol is specified |(?(protocol)(?:\:\d{1,6})|(?!))) \b #Word cannot end with @ (made to catch emails) (?![@]) #We accept any number of slugs, given we have a char after the slash (\/)? #If we have endings like ?=fds include the ending (?:([\w\d\?\-=#:%@&.;])+(?:\/(?:([\w\d\?\-=#:%@&;.])+))*)? #The last char cannot be one of these symbols .,?!,- exclude these (?<![.,?!-])
źródło
Myślę, że ten wzorzec regex obsługuje dokładnie to, co chcesz
/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/
a to jest przykład fragmentu kodu do wyodrębniania adresów URL:
// The Regular Expression filter $reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/"; // The Text you want to filter for urls $text = "The text you want /programming/6038061/regular-expression-to-find-urls-within-a-string to filter goes here."; // Check if there is a url in the text preg_match_all($reg_exUrl, $text, $url,$matches); var_dump($matches);
źródło
Wszystkie powyższe odpowiedzi nie są zgodne ze znakami Unicode w adresie URL, na przykład: http://google.com?query=đức+filan+đã+search
Aby rozwiązać ten problem, powinien zadziałać:
(ftp:\/\/|www\.|https?:\/\/){1}[a-zA-Z0-9u00a1-\uffff0-]{2,}\.[a-zA-Z0-9u00a1-\uffff0-]{2,}(\S*)
źródło
Jeśli musisz być rygorystyczny w wyborze linków, wybrałbym:
(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))
Aby uzyskać więcej informacji, przeczytaj to:
Ulepszony liberalny, dokładny wzorzec Regex dla dopasowanych adresów URL
źródło
Znalazłem to, które obejmuje większość przykładowych linków, w tym części podkatalogów.
Regex to:
(?:(?:https?|ftp):\/\/|\b(?:[a-z\d]+\.))(?:(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))?\))+(?:\((?:[^\s()<>]+|(?:\(?:[^\s()<>]+\)))?\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))?
źródło
Jeśli masz wzorzec adresu URL, powinieneś być w stanie wyszukać go w swoim ciągu. Po prostu upewnij się, że wzorzec nie ma
^
i$
oznacza początek i koniec ciągu adresu URL. Jeśli więc P jest wzorcem adresu URL, poszukaj dopasowań dla P.źródło
^(http|https|ftp)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&%\$#\=~])*[^\.\,\)\(\s]$
http://regexpal.com/
; tam możesz testować różne wyrażenia na swoim łańcuchu, dopóki nie uzyskasz poprawnego wyniku.Community
zakładką, w tym te dla adresów URLUżyłem poniżej wyrażenia regularnego, aby znaleźć adres URL w ciągu:
/(http|https)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/
źródło
[a-zA-Z]{2,3}
jest naprawdę kiepski pod względem dopasowania TLD, zobacz oficjalną listę: data.iana.org/TLD/tlds-alpha-by-domain.txtTutaj trochę bardziej zoptymalizowane wyrażenie regularne:
(?:(?:(https?|ftp|file):\/\/|www\.|ftp\.)|([\w\-_]+(?:\.|\s*\[dot\]\s*[A-Z\-_]+)+))([A-Z\-\.,@?^=%&:\/~\+#]*[A-Z\-\@?^=%&\/~\+#]){2,6}?
Oto test z danymi: https://regex101.com/r/sFzzpY/6
źródło
Krótkie i proste. Nie testowałem jeszcze w kodzie javascript, ale wygląda na to, że zadziała:
((http|ftp|https):\/\/)?(([\w.-]*)\.([\w]*))
Kod na regex101.com
źródło
Używam tego Regex:
/((\w+:\/\/\S+)|(\w+[\.:]\w+\S+))[^\s,\.]/ig
Działa dobrze w przypadku wielu adresów URL, takich jak: http://google.com , https://dev-site.io:8080/home?val=1&count=100 , www.regexr.com, localhost: 8080 / path,. ..
źródło
Jest to niewielka poprawa / dostosowanie (w zależności od potrzeb) odpowiedzi Rajeeva:
([\w\-_]+(?:(?:\.|\s*\[dot\]\s*[A-Z\-_]+)+))([A-Z\-\.,@?^=%&:/~\+#]*[A-Z\-\@?^=%&/~\+#]){2,6}?
Zobacz tutaj przykład tego, co robi, a czego nie.
Pozbyłem się czeku na „http” itp., Ponieważ chciałem przechwycić adresy URL bez tego. Dodałem nieznacznie do wyrażenia regularnego, aby złapać jakieś zaciemnione adresy URL (np. Gdy użytkownik używa [kropki] zamiast „.”). W końcu zastąpiłem „\ w” „AZ” na i „{2,3}”, aby zredukować fałszywe alarmy, takie jak v2.0 i „moo.0dd”.
Wszelkie ulepszenia tego powitania.
źródło
[a-zA-Z]{2,3}
jest naprawdę kiepski pod względem dopasowania TLD, zobacz oficjalną listę: data.iana.org/TLD/tlds-alpha-by-domain.txt . Również twoje dopasowanie wyrażenia regularnego_.........&&&&&&
nie jest pewne, czy jest to prawidłowy adres URL.Prawdopodobnie zbyt uproszczona, ale działająca metoda to:
[localhost|http|https|ftp|file]+://[\w\S(\.|:|/)]+
Przetestowałem to w Pythonie i tak długo, jak analiza ciągu zawiera spację przed i po oraz nie ma w adresie URL (czego nigdy wcześniej nie widziałem), powinno być dobrze.
Oto ide online, który to demonstruje
Jednak oto kilka korzyści z jej używania:
file:
alocalhost
także adresy IP#
lub-
(patrz adres URL tego postu)źródło
Użycie wyrażenia regularnego dostarczonego przez @JustinLevene nie miało odpowiednich sekwencji ucieczki w ukośnikach. Zaktualizowany, aby teraz był poprawny i dodany w stanie zgodnym również z protokołem FTP: będzie pasować do wszystkich adresów URL z protokołami lub bez nich oraz bez „www”.
Kod:
^((http|ftp|https):\/\/)?([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])?
Przykład: https://regex101.com/r/uQ9aL4/65
źródło
ULEPSZONY
Wykrywa takie adresy URL:
Regex:
/^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!\$&'\(\)\*\+,;=.]+$/gm
źródło
Napisałem jeden sam:
let regex = /([\w+]+\:\/\/)?([\w\d-]+\.)*[\w-]+[\.\:]\w+([\/\?\=\&\#]?[\w-]+)*\/?/gm
Działa na WSZYSTKICH następujących domenach:
https://www.facebook.com https://app-1.number123.com http://facebook.com ftp://facebook.com http://localhost:3000 localhost:3000/ unitedkingdomurl.co.uk this.is.a.url.com/its/still=going?wow shop.facebook.org app.number123.com app1.number123.com app-1.numbEr123.com app.dashes-dash.com www.facebook.com facebook.com fb.com/hello_123 fb.com/hel-lo fb.com/hello/goodbye fb.com/hello/goodbye?okay fb.com/hello/goodbye?okay=alright Hello www.google.com World http://yahoo.com https://www.google.com.tr/admin/subPage?qs1=sss1&qs2=sss2&qs3=sss3#Services https://google.com.tr/test/subPage?qs1=sss1&qs2=sss2&qs3=sss3#Services http://google.com/test/subPage?qs1=sss1&qs2=sss2&qs3=sss3#Services ftp://google.com/test/subPage?qs1=sss1&qs2=sss2&qs3=sss3#Services www.google.com.tr/test/subPage?qs1=sss1&qs2=sss2&qs3=sss3#Services www.google.com/test/subPage?qs1=sss1&qs2=sss2&qs3=sss3#Services drive.google.com/test/subPage?qs1=sss1&qs2=sss2&qs3=sss3#Services https://www.example.pl http://www.example.com www.example.pl example.com http://blog.example.com http://www.example.com/product http://www.example.com/products?id=1&page=2 http://www.example.com#up http://255.255.255.255 255.255.255.255
Możesz zobaczyć, jak to działa tutaj w regex101 i dostosować w razie potrzeby
źródło
Używam logiki znajdowania tekstu między dwiema kropkami lub kropkami
poniższe wyrażenie regularne działa dobrze z Pythonem
(?<=\.)[^}]*(?=\.)
źródło
Dopasowanie adresu URL w tekście nie powinno być tak skomplikowane
(?:(?:(?:ftp|http)[s]*:\/\/|www\.)[^\.]+\.[^ \n]+)
https://regex101.com/r/wewpP1/2
źródło
Użyłem tego
^(https?:\\/\\/([a-zA-z0-9]+)(\\.[a-zA-z0-9]+)(\\.[a-zA-z0-9\\/\\=\\-\\_\\?]+)?)$
źródło
(?:vnc|s3|ssh|scp|sftp|ftp|http|https)\:\/\/[\w\.]+(?:\:?\d{0,5})|(?:mailto|)\:[\w\.]+\@[\w\.]+
Jeśli chcesz wyjaśnić każdą część, wypróbuj regexr [.] Com, gdzie uzyskasz świetne wyjaśnienie każdej postaci.
Jest to podzielone znakiem „|” lub „LUB”, ponieważ nie wszystkie przydatne identyfikatory URI mają „//”, więc w tym miejscu możesz utworzyć listę schematów jako lub warunków, które chciałbyś dopasować.
źródło
Użyłem klasy C # Uri i działa dobrze z adresem IP, localhost
public static bool CheckURLIsValid(string url) { Uri returnURL; return (Uri.TryCreate(url, UriKind.Absolute, out returnURL) && (returnURL.Scheme == Uri.UriSchemeHttp || returnURL.Scheme == Uri.UriSchemeHttps)); }
źródło
Podobało mi się rozwiązanie Stefana Henze, ale przyniosło 34,56. Jest zbyt ogólny i mam nieprzetworzony html. Istnieją 4 kotwice dla adresu URL;
www,
http: \ (i co),
. po którym następują litery, a następnie /,
lub litery. i jeden z nich: https://ftp.isc.org/www/survey/reports/current/bynum.txt .
Wykorzystałem wiele informacji z tego wątku. Dziękuję wam wszystkim.
"(((((http|ftp|https|gopher|telnet|file|localhost):\\/\\/)|(www\\.)|(xn--)){1}([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:\\/~+#-]*[\\w@?^=%&\\/~+#-])?)|(([\\w_-]{2,200}(?:(?:\\.[\\w_-]+)*))((\\.[\\w_-]+\\/([\\w.,@?^=%&:\\/~+#-]*[\\w@?^=%&\\/~+#-])?)|(\\.((org|com|net|edu|gov|mil|int|arpa|biz|info|unknown|one|ninja|network|host|coop|tech)|(jp|br|it|cn|mx|ar|nl|pl|ru|tr|tw|za|be|uk|eg|es|fi|pt|th|nz|cz|hu|gr|dk|il|sg|uy|lt|ua|ie|ir|ve|kz|ec|rs|sk|py|bg|hk|eu|ee|md|is|my|lv|gt|pk|ni|by|ae|kr|su|vn|cy|am|ke))))))(?!(((ttp|tp|ttps):\\/\\/)|(ww\\.)|(n--)))"
Powyższe rozwiązuje prawie wszystko z wyjątkiem ciągu znaków, takich jak „eurls: www.google.com, facebook.com, http: //test.com/”, który zwraca jako pojedynczy ciąg. Tbh idk, dlaczego dodałem gopher itp. Sprawdzaj kod R.
if(T){ wierdurl<-vector() wierdurl[1]<-"https://JP納豆.例.jp/dir1/納豆 " wierdurl[2]<-"xn--jp-cd2fp15c.xn--fsq.jp " wierdurl[3]<-"http://52.221.161.242/2018/11/23/biofourmis-collab" wierdurl[4]<-"https://12000.org/ " wierdurl[5]<-" https://vg-1.com/?page_id=1002 " wierdurl[6]<-"https://3dnews.ru/822878" wierdurl[7]<-"The link of this question: /programming/6038061/regular-expression-to-find-urls-within-a-string Also there are some urls: www.google.com, facebook.com, http://test.com/method?param=wasd The code below catches all urls in text and returns urls in list. " wierdurl[8]<-"Thelinkofthisquestion:/programming/6038061/regular-expression-to-find-urls-within-a-string Alsotherearesomeurls:www.google.com,facebook.com,http://test.com/method?param=wasd Thecodebelowcatchesallurlsintextandreturnsurlsinlist. " wierdurl[9]<-"Thelinkofthisquestion:/programming/6038061/regular-expression-to-find-urls-within-a-stringAlsotherearesomeurlsZwww.google.com,facebook.com,http://test.com/method?param=wasdThecodebelowcatchesallurlsintextandreturnsurlsinlist." wierdurl[10]<-"1facebook.com/1res" wierdurl[11]<-"1facebook.com/1res/wat.txt" wierdurl[12]<-"www.e " wierdurl[13]<-"is this the file.txt i need" wierdurl[14]<-"xn--jp-cd2fp15c.xn--fsq.jpinspiredby " wierdurl[15]<-"[xn--jp-cd2fp15c.xn--fsq.jp/inspiredby " wierdurl[16]<-"xnto--jpto-cd2fp15c.xnto--fsq.jpinspiredby " wierdurl[17]<-"fsety--fwdvg-gertu56.ffuoiw--ffwsx.3dinspiredby " wierdurl[18]<-"://3dnews.ru/822878 " wierdurl[19]<-" http://mywebsite.com/msn.co.uk " wierdurl[20]<-" 2.0http://www.abe.hip " wierdurl[21]<-"www.abe.hip" wierdurl[22]<-"hardware/software/data" regexstring<-vector() regexstring[2]<-"(http|ftp|https)://([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?" regexstring[3]<-"/(?:(?:https?|ftp|file):\\/\\/|www\\.|ftp\\.)(?:\\([-A-Z0-9+&@#\\/%=~_|$?!:,.]*\\)|[-A-Z0-9+&@#\\/%=~_|$?!:,.])*(?:\\([-A-Z0-9+&@#\\/%=~_|$?!:,.]*\\)|[A-Z0-9+&@#\\/%=~_|$])/igm" regexstring[4]<-"[a-zA-Z0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]?" regexstring[5]<-"((http|ftp|https)\\:\\/\\/)?([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?" regexstring[6]<-"((http|ftp|https):\\/\\/)?([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:\\/~+#-]*[\\w@?^=%&\\/~+#-])?" regexstring[7]<-"(http|ftp|https)(:\\/\\/)([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?" regexstring[8]<-"(?:(?:https?|ftp|file):\\/\\/|www\\.|ftp\\.)(?:\\([-A-Z0-9+&@#/%=~_|$?!:,.]*\\)|[-A-Z0-9+&@#/%=~_|$?!:,.])*(?:\\([-A-Z0-9+&@#/%=~_|$?!:,.]*\\)|[A-Z0-9+&@#/%=~_|$])" regexstring[10]<-"((http[s]?|ftp):\\/)?\\/?([^:\\/\\s]+)((\\/\\w+)*\\/)([\\w\\-\\.]+[^#?\\s]+)(.*)?(#[\\w\\-]+)?" regexstring[12]<-"http[s:/]+[[:alnum:]./]+" regexstring[9]<-"http[s:/]+[[:alnum:]./]+" #in DLpages 230 regexstring[1]<-"[[:alnum:]-]+?[.][:alnum:]+?(?=[/ :])" #in link_graphs 50 regexstring[13]<-"^(?!mailto:)(?:(?:http|https|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$" regexstring[14]<-"(((((http|ftp|https):\\/\\/)|(www\\.)|(xn--)){1}([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:\\/~+#-]*[\\w@?^=%&\\/~+#-])?)|(([\\w_-]+(?:(?:\\.[\\w_-]+)*))((\\.((org|com|net|edu|gov|mil|int)|(([:alpha:]{2})(?=[, ]))))|([\\/]([\\w.,@?^=%&:\\/~+#-]*[\\w@?^=%&\\/~+#-])?))))(?!(((ttp|tp|ttps):\\/\\/)|(ww\\.)|(n--)))" regexstring[15]<-"(((((http|ftp|https|gopher|telnet|file|localhost):\\/\\/)|(www\\.)|(xn--)){1}([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:\\/~+#-]*[\\w@?^=%&\\/~+#-])?)|(([\\w_-]{2,200}(?:(?:\\.[\\w_-]+)*))((\\.[\\w_-]+\\/([\\w.,@?^=%&:\\/~+#-]*[\\w@?^=%&\\/~+#-])?)|(\\.((org|com|net|edu|gov|mil|int|arpa|biz|info|unknown|one|ninja|network|host|coop|tech)|(jp|br|it|cn|mx|ar|nl|pl|ru|tr|tw|za|be|uk|eg|es|fi|pt|th|nz|cz|hu|gr|dk|il|sg|uy|lt|ua|ie|ir|ve|kz|ec|rs|sk|py|bg|hk|eu|ee|md|is|my|lv|gt|pk|ni|by|ae|kr|su|vn|cy|am|ke))))))(?!(((ttp|tp|ttps):\\/\\/)|(ww\\.)|(n--)))" } for(i in wierdurl){#c(7,22) for(c in regexstring[c(15)]) { print(paste(i,which(regexstring==c))) print(str_extract_all(i,c)) } }
źródło
To jest najlepsza.
NSString *urlRegex="(http|ftp|https|www|gopher|telnet|file)(://|.)([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?";
źródło
To jest najprostsze. które działają dla mnie dobrze.
%(http|ftp|https|www)(://|\.)[A-Za-z0-9-_\.]*(\.)[a-z]*%
źródło
To jest po prostu proste.
Użyj tego wzoru:
\b((ftp|https?)://)?([\w-\.]+\.(com|net|org|gov|mil|int|edu|info|me)|(\d+\.\d+\.\d+\.\d+))(:\d+)?(\/[\w-\/]*(\?\w*(=\w+)*[&\w-=]*)*(#[\w-]+)*)?
Pasuje do każdego linku zawierającego:
Dozwolone protokoły: http, https i ftp
Dozwolone domeny: * .com, * .net, * .org, * .gov, * .mil, * .int, * .edu, * .info i * .me LUB IP
Dozwolone porty: prawda
Dozwolone parametry: prawda
Dozwolone skróty: prawda
źródło