Czy ktoś ma sugestie dotyczące wykrywania adresów URL w zestawie ciągów?
arrayOfStrings.forEach(function(string){
// detect URLs in strings and do something swell,
// like creating elements with links.
});
Aktualizacja: Skończyło się na używaniu tego wyrażenia regularnego do wykrywania linków… Najwyraźniej kilka lat później.
kLINK_DETECTION_REGEX = /(([a-z]+:\/\/)?(([a-z0-9\-]+\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel|local|internal))(:[0-9]{1,5})?(\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(\?[a-z0-9+_\-\.%=&]*)?)?(#[a-zA-Z0-9!$&'()*+.=-_~:@/?]*)?)(\s+|$)/gi
Pełen pomocnik (z opcjonalnym wsparciem dla kierownicy ) znajduje się pod numerem 1654670 .
javascript
regex
url
arbales
źródło
źródło
Odpowiedzi:
Najpierw potrzebujesz dobrego wyrażenia regularnego, które pasuje do adresów URL. To jest trudne. Zobacz tutaj , tutaj i tutaj :
W każdym razie ta odpowiedź nie ma na celu dostarczenia najlepszego wyrażenia regularnego, ale raczej dowód na to, jak wykonać zawijanie łańcucha wewnątrz tekstu za pomocą JavaScript.
OK, więc użyjmy tego:
/(https?:\/\/[^\s]+)/g
Ponownie, jest to zły regex . Będzie miał wiele fałszywych alarmów. Jednak jest wystarczająco dobry dla tego przykładu.
Podsumowując, spróbuj:
źródło
.replace
: |text="Find me at http://www.example.com, and also at http://stackoverflow.com."
skutkują dwoma 404. Niektórzy użytkownicy są tego świadomi i dodają spację po adresach URL przed interpunkcją, aby uniknąć zerwania, ale większość linkówfiers, z których korzystam (Gmail, etherpad, phabricator), oddziela końcowe znaki interpunkcyjne od adresu URL.Oto, czego ostatecznie użyłem jako mojego wyrażenia regularnego:
Nie obejmuje to końcowych znaków interpunkcyjnych w adresie URL. Funkcja Crescent działa jak urok :) więc:
źródło
urlRegex
powinno być zdefiniowane na zewnątrz,linkify
ponieważ kompilacja jest kosztowna.()
w każdej liście znaków i teraz działa.Szukałem w Google ten problem przez dłuższy czas, a potem przyszło mi do głowy, że istnieje metoda Android.text.util.Linkify, która wykorzystuje do tego dość solidne wyrażenia regularne. Na szczęście Android jest open source.
Używają kilku różnych wzorców dopasowywania różnych typów adresów URL. Znajdziesz je wszystkie tutaj: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.0_r1/android/text/util/Regex.java#Regex. 0WEB_URL_PATTERN
Jeśli martwisz się tylko adresami URL zgodnymi z WEB_URL_PATTERN, czyli adresami URL zgodnymi ze specyfikacją RFC 1738, możesz użyć tego:
Oto pełny tekst źródła:
Jeśli chcesz być naprawdę fantazyjny, możesz również przetestować adresy e-mail. Wyrażenie regularne dla adresów e-mail to:
PS: domeny najwyższego poziomu obsługiwane przez powyższe wyrażenie regularne są aktualne w czerwcu 2007 r. Aby uzyskać aktualną listę, sprawdź https://data.iana.org/TLD/tlds-alpha-by-domain.txt .
źródło
a-zA-Z
ihttp|https|Http|Https|rtsp|Rtsp
.Na podstawie odpowiedzi Crescent Fresh
jeśli chcesz wykryć linki z http: // LUB bez http: // i przez www. możesz użyć następujących
źródło
Ta biblioteka NPM wygląda na dość obszerną https://www.npmjs.com/package/linkifyjs
źródło
Funkcję można dodatkowo ulepszyć, aby renderować również obrazy:
lub w przypadku miniatury zawierającej link do obrazu o pełnym rozmiarze:
A oto funkcja strip (), która wstępnie przetwarza ciąg tekstowy w celu zapewnienia jednolitości, usuwając istniejący kod HTML.
źródło
Krótki kod Wielka praca! ...
Wynik:-
źródło
Istnieje pakiet npm: url-regex , po prostu zainstaluj go z
yarn add url-regex
lubnpm install url-regex
i użyj w następujący sposób:źródło
tmp.innerText jest niezdefiniowana. Powinieneś użyć tmp.innerHTML
źródło
Spróbuj tego:
rozpozna także adresy URL, takich jak
google.com
,http://www.google.bla
,http://google.bla
,www.google.bla
ale niegoogle.bla
źródło
Możesz użyć takiego wyrażenia regularnego, aby wyodrębnić normalne wzorce adresów URL.
Jeśli potrzebujesz bardziej wyszukanych wzorów, skorzystaj z takiej biblioteki.
https://www.npmjs.com/package/pattern-dreamer
źródło
(?:www\.|(?!www))
? Dlaczego powinienwwwww.com
być nieważny?Ogólne rozwiązanie zorientowane obiektowo
Dla ludzi takich jak ja, którzy używają frameworków takich jak angular, które nie pozwalają na bezpośrednie manipulowanie DOM, stworzyłem funkcję, która pobiera ciąg znaków i zwraca tablicę obiektów
url
/plainText
, których można użyć do stworzenia dowolnej reprezentacji interfejsu użytkownika.URL wyrażenia regularnego
Do dopasowania adresu URL użyłem (nieznacznie dostosowanego)
h0mayun
wyrażenia regularnego:/(?:(?:https?:\/\/)|(?:www\.))[^\s]+/g
Moja funkcja usuwa również znaki interpunkcyjne z końca adresu URL, takiego jak
.
i,
uważam, że częściej będzie to rzeczywista interpunkcja niż prawidłowe zakończenie adresu URL (ale może być! To nie jest rygorystyczna nauka, jak dobrze wyjaśniają inne odpowiedzi) W tym celu stosuję następujące wyrażenie regularne w dopasowanych adresach URL/^(.+?)([.,?!'"]*)$/
.Kod maszynopisu
źródło
Jeśli chcesz wykryć linki z http: // LUB bez http: // LUB ftp LUB w innych możliwych przypadkach, takich jak usunięcie końcowej interpunkcji na końcu, spójrz na ten kod.
https://jsfiddle.net/AndrewKang/xtfjn8g3/
Prostym sposobem na to jest użycie NPM
źródło