Korzystam z funkcji poniżej, aby dopasować adresy URL w danym tekście i zastąpić je linkami HTML. Wyrażenie regularne działa świetnie, ale obecnie zastępuję tylko pierwsze dopasowanie.
Jak mogę zastąpić cały adres URL? Wydaje mi się, że powinienem używać polecenia exec , ale tak naprawdę nie wymyśliłem, jak to zrobić.
function replaceURLWithHTMLLinks(text) {
var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/i;
return text.replace(exp,"<a href='$1'>$1</a>");
}
źródło
URL regexp from Component
nie zostało to skomentowane, pomocne byłoby wyjaśnienie tego, co robi.Autolinker.js
jest bardzo dobrze skomentowany i ma testy.urlize.js
Biblioteka związana w odpowiedzi Vebjørn Ljosa jest również wygląda potężniejszy i dobrze utrzymane, mimo że nie ma testów.Zastępowanie adresów URL linkami (odpowiedź na ogólny problem)
Wyrażenie regularne w pytaniu pomija wiele przypadkowych przypadków. Podczas wykrywania adresów URL zawsze lepiej jest używać specjalistycznej biblioteki, która obsługuje międzynarodowe nazwy domen, nowe TLD, takie jak
.museum
, nawiasy i inne znaki interpunkcyjne w adresie URL i na końcu oraz wiele innych przypadków na krawędzi. Zobacz post na blogu Jeffa Atwooda Problem z adresami URL, aby uzyskać wyjaśnienie niektórych innych problemów.„Spraw, aby wyrażenie regularne zastępowało więcej niż jedno dopasowanie” (odpowiedź na konkretny problem)
Dodaj „g” na końcu wyrażenia regularnego, aby umożliwić dopasowanie globalne:
Ale to tylko rozwiązuje problem w pytaniu, w którym wyrażenie regularne zastępowało tylko pierwsze dopasowanie. Nie używaj tego kodu.
źródło
Wprowadziłem kilka drobnych modyfikacji w kodzie Travisa (aby uniknąć niepotrzebnej ponownej deklaracji - ale działa świetnie na moje potrzeby, więc dobra robota!):
źródło
[a-zA-Z]{2,6}
powinien przeczytać coś podobnego do(?:[a-zA-Z]{2,6})+
, aby dopasować bardziej skomplikowane nazwy domen, np. [email protected].http://
lubwww
? Czy to zadziała dla tego rodzaju adresów URL?replacePattern3 = /(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6})/gim;
dzięki temureplacePattern3 = /(\w+@[a-zA-Z_]+?(\.[a-zA-Z]{2,6})+)/gim;
Dokonałem pewnych optymalizacji
Linkify()
powyższego kodu Travisa . Naprawiłem również błąd polegający na tym, że adresy e-mail z formatami typów poddomen nie były dopasowane (np. Przykł[email protected]).Ponadto zmieniłem implementację na prototypowanie
String
klasy, aby elementy można było dopasować w następujący sposób:Tak czy inaczej, oto skrypt:
źródło
+
nazwami użytkowników poczty e-mail, takimi jak[email protected]
. Naprawiłem to za pomocą wzorca e-maila/[\w.+]+@[a-zA-Z_-]+?(?:\.[a-zA-Z]{2,6})+/gim
(zwróć uwagę na+
pierwsze nawiasy), ale nie wiem, czy to coś psuje.Dzięki, to było bardzo pomocne. Chciałem też czegoś, co łączyłoby rzeczy, które wyglądały jak adresy URL - jako podstawowy wymóg łączyłoby coś takiego jak www.yahoo.com, nawet jeśli prefiks protokołu http: // nie był obecny. Zasadniczo, jeśli „www”. jest obecny, połączy go i przyjmie, że to http: //. Chciałem też, aby wiadomości e-mail zamieniły się w mailto: linki. PRZYKŁAD: www.yahoo.com zostanie przekonwertowany na www.yahoo.com
Oto kod, na którym się skończyłem (kombinacja kodu z tej strony i innych rzeczy, które znalazłem online i innych rzeczy, które zrobiłem sam):
W drugim zastępowaniu część (^ | [^ /]) zastępuje www.whokolwiek.com tylko wtedy, gdy nie jest poprzedzona przedrostkiem // - aby uniknąć podwójnego linkowania, jeśli adres URL był już połączony przy pierwszej zamianie. Możliwe jest również, że www.whokolwiek.com może znajdować się na początku łańcucha, co jest pierwszym warunkiem „lub” w tej części wyrażenia regularnego.
Można to zintegrować jako wtyczkę jQuery, jak zilustrowano powyżej Jesse P. - ale szczególnie chciałem regularnej funkcji, która nie działałaby na istniejącym elemencie DOM, ponieważ pobieram tekst, który mam, a następnie dodam go do DOM, i Chcę, aby tekst był „linkified” przed dodaniem go, więc przekazuję tekst przez tę funkcję. Działa świetnie.
źródło
Identyfikacja adresów URL jest trudna, ponieważ często są otoczone znakami interpunkcyjnymi i ponieważ użytkownicy często nie używają pełnej formy adresu URL. Istnieje wiele funkcji JavaScript służących do zastępowania adresów URL hiperłączami, ale nie udało mi się znaleźć takiej, która działałaby tak dobrze, jak
urlize
filtr w opartym na języku Python frameworku Django. Dlatego przeniosłemurlize
funkcję Django do JavaScript:Przykład:
Drugi argument, jeśli jest prawdziwy, powoduje
rel="nofollow"
wstawienie. Trzeci argument, jeśli jest prawdziwy, unika znaków, które mają specjalne znaczenie w HTML. Zobacz plik README .źródło
django_compatible
na false, to będzie trwać lepiej w przypadku użycia.urlize
nie obsługuje poprawnie TLD (przynajmniej nie port JS w GitHub). Biblioteką, która prawidłowo obsługuje TLD jest JavaScript Linkfy Ben Almana .Wprowadziłem zmianę w Roshambo String.linkify () w emailAddressPattern, aby rozpoznać adresy aaa.bbb. @ Ccc.ddd
źródło
Szukałem w Google czegoś nowego i natknąłem się na ten:
demo: http://jsfiddle.net/kachibito/hEgvc/1/
Działa naprawdę dobrze dla normalnych linków.
źródło
http://example.com/folder/folder/folder/
lubhttps://example.org/blah
etc - tylko typowy non-crazy format adresu URL, który będzie pasował do 95-99% przypadków użycia tam. Używam tego do wewnętrznego obszaru administracyjnego, więc nie potrzebuję niczego wymyślnego, aby złapać przypadkowe przypadki lub haslinki.Najlepszy skrypt do tego: http://benalman.com/projects/javascript-linkify-process-lin/
źródło
To rozwiązanie działa jak wiele innych i faktycznie używa tego samego wyrażenia regularnego co jedno z nich, jednak zamiast zwracania ciągu HTML zwróci fragment dokumentu zawierający element A i wszelkie odpowiednie węzły tekstowe.
Istnieją pewne zastrzeżenia, a mianowicie ze starszą obsługą IE i textContent.
tutaj jest demo.
źródło
Jeśli chcesz pokazać krótszy link (tylko domenę), ale z tym samym długim adresem URL, możesz wypróbować moją modyfikację wersji kodu Sama Haslera opublikowanej powyżej
źródło
Reg Ex:
/(\b((https?|ftp|file):\/\/|(www))[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|]*)/ig
Poniżej kilka testowanych ciągów:
Uwaga: jeśli nie chcesz przekazać
www
poprawnego, użyj poniższej opcji reg np:/(\b((https?|ftp|file):\/\/|(www))[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig
źródło
Należy zauważyć ostrzeżenia o złożoności URI, ale prosta odpowiedź na twoje pytanie brzmi:
aby zastąpić każde dopasowanie, musisz dodać
/g
flagę na końcu RegEx:/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi
źródło
prosty przykład
źródło
Nie komplikuj! Powiedz to, czego nie możesz mieć, niż to, co możesz mieć :)
Jak wspomniano powyżej, adresy URL mogą być dość złożone, szczególnie po „?”, I nie wszystkie zaczynają się od „www”. na przykład
maps.bing.com/something?key=!"£$%^*()&lat=65&lon&lon=20
Więc zamiast skomplikowanego wyrażenia regularnego, które nie spełnia wszystkich przypadków brzegowych i będzie trudne do utrzymania, co powiesz na ten o wiele prostszy, który działa dobrze dla mnie w praktyce.
Mecz
http(s):// (anything but a space)+
www. (anything but a space)+
Gdzie „cokolwiek” jest
[^'"<>\s]
... w zasadzie zachłannym dopasowaniem, kontynuowanie spotkania, cytatu, nawiasu kątowego lub końca liniiRównież:
Pamiętaj, aby sprawdzić, czy nie jest już w formacie URL, np. Tekst zawiera
href="..."
lubsrc="..."
Dodaj ref = nofollow (w razie potrzeby)
To rozwiązanie nie jest tak „dobre” jak wspomniane powyżej biblioteki, ale jest znacznie prostsze i działa dobrze w praktyce.
źródło
Prawidłowe wykrywanie adresów URL z obsługą domen międzynarodowych i znaków astralnych nie jest trywialne.
linkify-it
biblioteka buduje wyrażenia regularne z wielu warunków , a końcowy rozmiar to około 6 kilobajtów :). Jest dokładniejszy niż wszystkie biblioteki lib, obecnie przywoływane w zaakceptowanej odpowiedzi.Zobacz linki demo-it aby sprawdzić na żywo wszystkie przypadki Edge i przetestować swoje.
Jeśli potrzebujesz linkować źródło HTML, powinieneś go najpierw przeanalizować i powtórzyć każdy token tekstowy osobno.
źródło
Napisałem kolejną bibliotekę JavaScript, może być dla ciebie lepsza, ponieważ jest bardzo wrażliwa z najmniej możliwą liczbą fałszywych trafień, szybka i ma niewielkie rozmiary. Obecnie aktywnie go utrzymuję, więc przetestuj go na stronie demonstracyjnej i sprawdź, jak by to działało.
link: https://github.com/alexcorvi/anchorme.js
źródło
Musiałem zrobić coś przeciwnego i zrobić linki HTML tylko w adresie URL, ale zmodyfikowałem wyrażenie regularne i działa jak urok, dzięki :)
źródło
Wykrywanie wiadomości e-mail w powyższej odpowiedzi Travitrona nie działało dla mnie, więc rozszerzyłem / zastąpiłem go następującym kodem (kod C #).
Pozwala to na adresy e-mail, takie jak „ imię[email protected] ”.
źródło
Po wejściu z kilku źródeł mam teraz rozwiązanie, które działa dobrze. Miało to związek z pisaniem własnego kodu zastępczego.
Odpowiedź .
Fiddle .
źródło
Zamień adresy URL w tekście na linki HTML, zignoruj adresy URL w tagu href / pre. https://github.com/JimLiu/auto-link
źródło
Oto moje rozwiązanie:
źródło
Wypróbuj poniższą funkcję:
alert(anchorify("Hola amigo! https://www.sharda.ac.in/academics/"));
źródło
Wypróbuj poniższe rozwiązanie
źródło