2011-11-05 29 views
8

Vui lòng giúp tôi với cụm từ thông dụng.regex cách thay thế liên kết twitter

tôi thấy hòa bình tốt mã này:

var ify = function() { 
     return { 
     "link": function(t) { 
      return t.replace(/(^|\s+)(https*\:\/\/\S+[^\.\s+])/g, function(m, m1, link) { 
      return m1 + '<a href=' + link + '>' + ((link.length > 25) ? link.substr(0, 24) + '...' : link) + '</a>'; 
      }); 
     }, 
     "at": function(t) { 
      return t.replace(/(^|\s+)\@([a-zA-Z0-9_]{1,15})/g, function(m, m1, m2) { 
      return m1 + '@<a href="http://twitter.com/' + m2 + '">' + m2 + '</a>'; 
      }); 

    }, 
    "hash": function(t) { 
     return t.replace(/(^|\s+)\#([a-zA-Z0-9_]+)/g, function(m, m1, m2) { 
     return m 

1 + '#<a href="http://search.twitter.com/search?q=%23' + m2 + '">' + m2 + '</a>'; 
      }); 
     }, 
     "clean": function(tweet) { 
      return this.hash(this.at(this.link(tweet))); 
     } 
     }; 
    }(); 

Nhưng nó không làm việc đúng cách.

Lúc đầu trong trang của tôi có thể có <b>@username</b> và cho nguyên nhân regex này isnt làm việc (tôi nghĩ rằng tôi cần phải thêm nhân vật này "<" và ">" đến "tại chức năng". Nhưng làm thế nào?)

Ở vị trí thứ hai trong hàm "băm" trong trang của tôi, trong truy vấn có thể có các ký tự không phải là zA-Z khác). Ví dụ: "такие символы" hoặc "ñ" hoặc những người khác. Và chuỗi được định dạng sẽ trông giống như #<a href="twitter.com/?q=Catalu">Catalu</a>ña cho #Cataluña từ

Hãy giúp tôi. Cảm ơn bạn!

Trả lời

14
function processTweetLinks(text) { 
    var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/i; 
    text = text.replace(exp, "<a href='$1' target='_blank'>$1</a>"); 
    exp = /(^|\s)#(\w+)/g; 
    text = text.replace(exp, "$1<a href='http://search.twitter.com/search?q=%23$2' target='_blank'>#$2</a>"); 
    exp = /(^|\s)@(\w+)/g; 
    text = text.replace(exp, "$1<a href='http://www.twitter.com/$2' target='_blank'>@$2</a>"); 
    return text; 
} 
+2

này không làm việc cho hai liên kết trong một hàng như 'processTweetLinks (' @ james Đây là một bài kiểm tra liên kết. http://www.google.co.uk http://www.yahoo.co.uk '); 'trừ khi bạn thêm cờ tham lam vào cụm từ thông dụng thứ nhất:' var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9 + & @ # \ /% = ~ _ |])/gi; ' – howard10

0

Regex bắt đầu bằng /(^|\s+), điều này có nghĩa là nó chỉ khớp với @foo chỉ khi nó ở đầu tài liệu hoặc khi nó ở trước dấu cách.

Sau đó, regex chỉ phù hợp với chữ cái, số và dấu gạch dưới.

Có thể bạn nên đặt kết hợp ít nghiêm ngặt hơn và khớp với một chuỗi ký tự không phải là không gian, như \@(!\s){1,15}\s, mặc dù tôi không chắc liệu các ký tự unicode đó có được phép trong tên Twitter hay không. Rất nhiều tài liệu đề cập đến chỉ [A-Za-z0-9]. Điều này có thay đổi không?

2

Dưới đây là mã của tôi để làm điều đó:

function addTwitterLinks(text) { 
    return text.replace(/[\@\#]([a-zA-z0-9_]*)/g, 
     function(m,m1) { 
      var t = '<a href="http://twitter.com/'; 
      if(m.charAt(0) == '#') 
       t += 'hashtag/'; 
      return t + encodeURI(m1) + '" target="_blank">' + m + '</a>'; 
     }); 
} 

Và đây là một bản demo của nó trong hành động: http://siliconsparrow.com/javascripttwittertest.html

+0

OP cũng muốn liên kết – jeremy

Các vấn đề liên quan