Saya menggunakan fungsi di bawah ini untuk mencocokkan URL di dalam teks yang diberikan dan menggantinya dengan tautan HTML. Ekspresi reguler berfungsi dengan baik, tetapi saat ini saya hanya mengganti pertandingan pertama.
Bagaimana saya bisa mengganti semua URL? Saya kira saya harus menggunakan perintah exec , tapi saya tidak benar-benar mencari cara untuk melakukannya.
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>");
}
sumber
URL regexp from Component
tidak berkomentar, beberapa penjelasan tentang apa yang dilakukannya akan sangat membantu.Autolinker.js
berkomentar dengan sangat baik dan memiliki tes. Theurlize.js
perpustakaan terkait dalam jawaban Vebjorn Ljosa ini juga terlihat featureful dan terawat dengan baik, meskipun tidak memiliki tes.Mengganti URL dengan tautan (Jawab untuk Masalah Umum)
Ekspresi reguler dalam pertanyaan kehilangan banyak kasus tepi. Saat mendeteksi URL, selalu lebih baik menggunakan perpustakaan khusus yang menangani nama domain internasional, seperti TLD baru
.museum
, tanda kurung dan tanda baca lainnya di dalam dan di akhir URL, dan banyak kasus tepi lainnya. Lihat posting blog Jeff Atwood The Problem With URLs untuk penjelasan tentang beberapa masalah lainnya."Buat ekspresi reguler ganti lebih dari satu kecocokan" (Jawab untuk masalah tertentu)
Tambahkan "g" ke akhir ekspresi reguler untuk mengaktifkan pencocokan global:
Tapi itu hanya memperbaiki masalah di pertanyaan di mana ekspresi reguler hanya menggantikan pertandingan pertama. Jangan gunakan kode itu.
sumber
Saya telah membuat beberapa modifikasi kecil pada kode Travis (hanya untuk menghindari deklarasi ulang yang tidak perlu - tetapi ini berfungsi baik untuk kebutuhan saya, pekerjaan yang sangat bagus!):
sumber
[a-zA-Z]{2,6}
harus membaca sesuatu di sepanjang baris(?:[a-zA-Z]{2,6})+
agar sesuai dengan nama domain yang lebih rumit, yaitu [email protected].http://
atauwww
? Apakah ini akan berfungsi untuk URL semacam itu?replacePattern3 = /(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6})/gim;
dengan inireplacePattern3 = /(\w+@[a-zA-Z_]+?(\.[a-zA-Z]{2,6})+)/gim;
yang memperbaiki masalah mailto :)Buat beberapa optimasi pada
Linkify()
kode Travis di atas. Saya juga memperbaiki bug di mana alamat email dengan format tipe subdomain tidak akan cocok (yaitu [email protected]).Selain itu, saya mengubah implementasinya menjadi prototipe
String
kelas sehingga item dapat dicocokkan seperti:Bagaimanapun, ini skripnya:
sumber
+
nama pengguna email, seperti[email protected]
. Saya memperbaikinya dengan pola email/[\w.+]+@[a-zA-Z_-]+?(?:\.[a-zA-Z]{2,6})+/gim
(perhatikan+
di kurung pertama), tetapi saya tidak tahu apakah itu merusak sesuatu yang lain.Terima kasih, ini sangat membantu. Saya juga menginginkan sesuatu yang akan menautkan hal-hal yang tampak seperti URL - sebagai persyaratan dasar, itu akan menautkan sesuatu seperti www.yahoo.com, bahkan jika awalan http: // protokol tidak ada. Jadi pada dasarnya, jika "www." ada, itu akan menautkannya dan menganggap itu http: //. Saya juga ingin email berubah menjadi mailto: tautan. CONTOH: www.yahoo.com akan dikonversi ke www.yahoo.com
Inilah kode yang akhirnya saya dapatkan (kombinasi kode dari halaman ini dan hal-hal lain yang saya temukan online, dan hal-hal lain yang saya lakukan sendiri):
Di ganti ke-2, bagian (^ | [^ /]) hanya menggantikan www.wh whatever.com jika belum diawali oleh // - untuk menghindari penautan ganda jika URL sudah ditautkan pada penggantian pertama. Juga, mungkin saja www.wh whatever.com mungkin berada di awal string, yang merupakan kondisi "atau" pertama di bagian regex tersebut.
Ini dapat diintegrasikan sebagai plugin jQuery seperti yang diilustrasikan oleh Jesse P di atas - tetapi saya secara khusus menginginkan fungsi reguler yang tidak bekerja pada elemen DOM yang ada, karena saya mengambil teks yang saya miliki dan kemudian menambahkannya ke DOM, dan Saya ingin teks menjadi "ditautkan" sebelum saya menambahkannya, jadi saya meneruskan teks melalui fungsi ini. Bagus sekali.
sumber
Mengidentifikasi URL itu rumit karena sering dikelilingi oleh tanda baca dan karena pengguna sering tidak menggunakan bentuk lengkap dari URL. Banyak fungsi JavaScript ada untuk mengganti URL dengan hyperlink, tapi saya tidak dapat menemukan yang berfungsi serta
urlize
filter dalam kerangka kerja web Django yang berbasis Python. Karena itu saya memindahkanurlize
fungsi Django ke JavaScript:Sebuah contoh:
Argumen kedua, jika benar, menyebabkan
rel="nofollow"
dimasukkan. Argumen ketiga, jika benar, lolos dari karakter yang memiliki arti khusus dalam HTML. Lihat file README .sumber
django_compatible
ke false, itu akan menangani kasus penggunaan yang sedikit lebih baik.urlize
tidak mendukung TLD dengan benar (setidaknya bukan port JS di GitHub). Perpustakaan yang menangani TLD dengan benar adalah Ben Alman JavaScript Linkify .Saya membuat perubahan ke Roshambo String.linkify () ke emailAddressPattern untuk mengenali alamat aaa.bbb. @ Ccc.ddd
sumber
Saya mencari di Google untuk sesuatu yang lebih baru dan menemukan ini:
demo: http://jsfiddle.net/kachibito/hEgvc/1/
Bekerja sangat baik untuk tautan normal.
sumber
http://example.com/folder/folder/folder/
atauhttps://example.org/blah
lainnya - hanya format URL tidak gila khas Anda yang akan cocok dengan 95-99% kasus penggunaan di luar sana. Saya menggunakan ini untuk area administrasi internal, jadi saya tidak perlu sesuatu yang mewah untuk menangkap kasus tepi atau hashlinks.Script terbaik untuk melakukan ini: http://benalman.com/projects/javascript-linkify-process-lin/
sumber
Solusi ini berfungsi seperti yang lain, dan pada kenyataannya menggunakan regex yang sama seperti salah satu dari mereka, namun sebagai ganti mengembalikan HTML String ini akan mengembalikan sebuah fragmen dokumen yang mengandung elemen A dan semua node teks yang berlaku.
Ada beberapa peringatan, yaitu dengan IE yang lebih lama dan dukungan textContent.
di sini adalah demo.
sumber
Jika Anda perlu menunjukkan tautan yang lebih pendek (hanya domain), tetapi dengan URL panjang yang sama, Anda dapat mencoba modifikasi saya dari versi kode Sam Hasler yang diposting di atas
sumber
Reg Ex:
/(\b((https?|ftp|file):\/\/|(www))[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|]*)/ig
Berikut adalah beberapa string yang diuji:
Catatan: Jika Anda tidak ingin lulus
www
sebagai valid, gunakan saja di bawah ini reg ex:/(\b((https?|ftp|file):\/\/|(www))[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig
sumber
Peringatan tentang kompleksitas URI harus dicatat, tetapi jawaban sederhana untuk pertanyaan Anda adalah:
Untuk mengganti setiap kecocokan Anda perlu menambahkan
/g
bendera ke akhir RegEx:/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi
sumber
contoh sederhana
sumber
Tetap sederhana! Katakan apa yang tidak bisa Anda miliki, daripada apa yang bisa Anda miliki :)
Seperti disebutkan di atas, URL bisa sangat kompleks, terutama setelah '?', Dan tidak semuanya dimulai dengan 'www.' misalnya
maps.bing.com/something?key=!"£$%^*()&lat=65&lon&lon=20
Jadi, daripada memiliki regex kompleks yang tidak akan memenuhi semua kasus tepi, dan akan sulit untuk mempertahankan, bagaimana dengan yang jauh lebih sederhana ini, yang bekerja dengan baik untuk saya dalam praktik.
Pertandingan
http(s):// (anything but a space)+
www. (anything but a space)+
Di mana 'apa pun' berada
[^'"<>\s]
... pada dasarnya pertandingan serakah, membawa Anda bertemu spasi, kutipan, braket sudut, atau akhir barisJuga:
Ingatlah untuk memeriksa bahwa itu belum dalam format URL, misalnya teks berisi
href="..."
atausrc="..."
Tambahkan ref = nofollow (jika sesuai)
Solusi ini tidak sebagus perpustakaan yang disebutkan di atas, tetapi jauh lebih sederhana, dan bekerja dengan baik dalam praktiknya.
sumber
Deteksi URL yang benar dengan dukungan domain internasional & karakter astral bukanlah hal sepele.
linkify-it
perpustakaan membangun regex dari banyak kondisi , dan ukuran akhir sekitar 6 kilobyte :). Ini lebih akurat daripada semua lib, saat ini dirujuk dalam jawaban yang diterima.Lihat demo linkify-it untuk memeriksa semua kasus tepi langsung dan menguji yang Anda miliki .
Jika Anda perlu menautkan sumber HTML, Anda harus menguraikannya terlebih dahulu, dan mengulangi setiap token teks secara terpisah.
sumber
Saya telah menulis pustaka JavaScript yang lain, mungkin lebih baik bagi Anda karena sangat peka dengan kemungkinan kesalahan seminimal mungkin, cepat dan kecil. Saya saat ini secara aktif memeliharanya jadi tolong lakukan pengujian di halaman demo dan lihat bagaimana itu akan bekerja untuk Anda.
tautan: https://github.com/alexcorvi/anchorme.js
sumber
Saya harus melakukan yang sebaliknya, dan membuat tautan html menjadi hanya URL, tapi saya memodifikasi regex Anda dan itu berfungsi seperti pesona, terima kasih :)
sumber
Deteksi email dalam jawaban Travitron di atas tidak berfungsi untuk saya, jadi saya memperpanjang / menggantinya dengan yang berikut (kode C #).
Ini memungkinkan alamat email seperti " [email protected] ".
sumber
Setelah input dari beberapa sumber, sekarang saya sudah solusi yang bekerja dengan baik. Itu ada hubungannya dengan menulis kode pengganti Anda sendiri.
Jawaban .
Biola .
sumber
Ganti URL dalam teks dengan tautan HTML, abaikan URL dalam tag href / pre. https://github.com/JimLiu/auto-link
sumber
Inilah solusi saya:
sumber
Coba fungsi di bawah ini:
alert(anchorify("Hola amigo! https://www.sharda.ac.in/academics/"));
sumber
Coba Solusi Di Bawah Ini
sumber