2008-10-29 26 views
39

Có ai biết một tập lệnh có thể chọn tất cả các tham chiếu văn bản đến URL và tự động thay thế chúng bằng các thẻ liên kết trỏ đến các vị trí đó không?Văn bản jQuery để liên kết tập lệnh?

For example: 

http://www.google.com 

would automatically turn into 

<a href="http://www.google.com">http://www.google.com</a> 

Lưu ý: Tôi muốn điều này vì tôi không muốn xem hết nội dung của mình và gói chúng bằng thẻ neo.

+0

javascript có phải là môi trường duy nhất có sẵn cho bạn hoặc bạn có một chương trình phụ trợ máy chủ như php không? – DGM

+0

Tôi đã tạo một thư viện mà bạn có thể muốn xem xét: ali-saleem.github.io/anchorme.js có kích thước rất nhỏ, rất hiệu quả, rất nhạy cảm, mang lại số tiền tích cực sai nhất, hỗ trợ tất cả các TLD, hỗ trợ IP, FTP, HTTP hoặc thậm chí không có http, bỏ qua HTML, không có regex và nhanh gấp 3 lần so với liên kết và autolinker. –

Trả lời

13

JQuery sẽ không giúp bạn rất nhiều ở đây vì bạn không thực sự quan tâm đến quá trình điều hướng/thao tác DOM (ngoài việc tạo thẻ neo). Nếu tất cả các URL của bạn nằm trong các thẻ < p class = "url" > thì có thể.

Giải pháp JavaScript vani có thể là những gì bạn muốn và số phận sẽ có, this guy should have you covered.

+0

Cảm ơn người đàn ông! Tốt điểm ... –

+5

Tôi không đồng ý, giải quyết vấn đề này liên quan đến rất nhiều DOM đi qua (có thể không phải là rất nhiều bộ chọn CSS) và jQuery là một công cụ tốt để giải quyết điều này với. (Xem bản nháp mẫu của tôi cho một plugin jQuery bên dưới.) –

4

Tôi khuyên bạn nên làm điều này trên các trang tĩnh trước khi hiển thị cho trình duyệt hoặc bạn sẽ đẩy gánh nặng của tính toán chuyển đổi lên khách truy cập kém. :) Đây là cách bạn có thể làm điều đó trong Ruby (đọc từ stdin, viết tới stdout):

while line = gets 
    puts line.gsub(/(^|[^"'])(http\S+)/, "\\1<a href='\\2'>\\2</a>") 
end 

Rõ ràng, bạn sẽ muốn suy nghĩ về cách làm cho điều này mạnh mẽ như bạn mong muốn. Ở trên yêu cầu tất cả các URL bắt đầu bằng http và sẽ kiểm tra không chuyển đổi các URL có dấu ngoặc kép (tức là URL có thể nằm trong một số < a href = "..." >). Nó sẽ không bắt ftp: //, mailto :. Nó sẽ chuyển đổi hạnh phúc tài liệu ở những nơi như các cơ quan > mà bạn có thể không muốn xảy ra.

Giải pháp thỏa đáng nhất là thực sự thực hiện chuyển đổi bằng tay với trình soạn thảo của bạn để bạn có thể nhãn cầu và phê duyệt tất cả các thay thế. A good editor sẽ cho phép bạn thực hiện thay thế regexp bằng tham chiếu nhóm (còn gọi là tham chiếu ngược), vì vậy nó không phải là vấn đề lớn.

0

Nếu bạn muốn có giải pháp từ góc nhìn khác ... nếu bạn có thể chạy các trang thông qua php và Trình lọc HTML, nó có thể tự động định dạng đầu ra và liên kết bất kỳ url nào.

56

LƯU Ý: Một phiên bản cập nhật và chỉnh sửa kịch bản này hiện đã có tại https://github.com/maranomynet/linkify (giấy phép GPL/MIT)


Hmm ... với tôi điều này có vẻ như nhiệm vụ hoàn hảo cho jQuery.

... một cái gì đó như thế này đã ra khỏi đỉnh đầu tôi:

// Define: Linkify plugin 
(function($){ 

    var url1 = /(^|&lt;|\s)(www\..+?\..+?)(\s|&gt;|$)/g, 
     url2 = /(^|&lt;|\s)(((https?|ftp):\/\/|mailto:).+?)(\s|&gt;|$)/g, 

     linkifyThis = function() { 
     var childNodes = this.childNodes, 
      i = childNodes.length; 
     while(i--) 
     { 
      var n = childNodes[i]; 
      if (n.nodeType == 3) { 
      var html = $.trim(n.nodeValue); 
      if (html) 
      { 
       html = html.replace(/&/g, '&amp;') 
         .replace(/</g, '&lt;') 
         .replace(/>/g, '&gt;') 
         .replace(url1, '$1<a href="http://$2">$2</a>$3') 
         .replace(url2, '$1<a href="$2">$2</a>$5'); 
       $(n).after(html).remove(); 
      } 
      } 
      else if (n.nodeType == 1 && !/^(a|button|textarea)$/i.test(n.tagName)) { 
      linkifyThis.call(n); 
      } 
     } 
     }; 

    $.fn.linkify = function() { 
    return this.each(linkifyThis); 
    }; 

})(jQuery); 

// Usage example: 
jQuery('div.textbody').linkify(); 

Nó cố gắng để biến tất cả các lần xuất hiện trong các cách sau thành liên kết:

  • www.example.com/path
  • http://www.example.com/path
  • mailto:[email protected]
  • ftp://www.server.com/path
  • ... tất cả những điều trên được bao bọc trong dấu ngoặc nhọn (tức là < ...>)

Thưởng thức :-)

+0

Lỗi cú pháp nhỏ: trong khi (i--) {// lưu ý khung phụ Cảm ơn! Plugin đó chính là thứ tôi đang tìm kiếm. –

+0

Đã sửa lỗi, cảm ơn! –

+0

BTW, phiên bản cập nhật và sửa chữa của tập lệnh này hiện đã có sẵn (GPL/MIT) tại http://github.com/maranomynet/linkify –

1

Việc làm này server-side không phải là một lựa chọn đôi khi. Hãy nghĩ về một client-side Twitter Widget (mà đi trực tiếp lên Twitter API sử dụng jsonp), và bạn muốn linkify tất cả các URL trong Tweets động ...

2

Hãy xem plugin này JQuery: https://code.google.com/p/jquery-linkifier/

+0

Plugin đó rất ngây thơ. Nó đề cập đến không có nghệ thuật trước đây, mặc dù có [tấn phân tích cú pháp URL và thư viện xác thực trên mạng] (http://stackoverflow.com/a/21925491/1269037). –

5

Tôi có chức năng này tôi gọi

textToLinks: function(text) { 

    var re = /(https?:\/\/(([-\w\.]+)+(:\d+)?(\/([\w/_\.]*(\?\S+)?)?)?))/g; 
    return text.replace(re, "<a href=\"$1\" title=\"\">$1</a>"); 
    } 
Các vấn đề liên quan