2011-11-05 47 views
8

請幫我定期表達。正則表達式如何替換twitter鏈接

我發現這個代碼良好的和平:

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))); 
     } 
     }; 
    }(); 

但它不能正常工作。

首先,在我的網頁可以有<b>@username</b>也爲此正則表達式的心不是工作(我想我需要這個字符「<」和「>」添加到「在功能」,但是怎麼樣?)

在我的頁面的「散列」函數中,在查詢中可以有其他非a-zA-Z字符)。例如「такиесимволы」或「ñ」或其他。和格式化的字符串看起來像#<a href="twitter.com/?q=Catalu">Catalu</a>ña#Cataluña

請幫我。謝謝!

回答

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

這並不適用於連續兩個環節,比如'processTweetLinks工作(」 @james這是一個鏈接測試,http://www.google.co.uk http://www.yahoo.co.uk');'除非您將第一個正則表達式添加爲貪婪標誌:'var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9 +&@#\ /%=〜_ |])/ gi;' – howard10

0

正則表達式以/(^|\s+)開頭,這意味着只有當它位於文檔的開始處或其前面有一個空格時,才匹配@foo

然後正則表達式只匹配字母,數字和下劃線。

也許你應該使匹配不太嚴格,並匹配一系列不是空格的字符,如\@(!\s){1,15}\s,儘管我不確定這些Unicode字符是否允許在Twitter名稱中使用。很多文件只提到[A-Za-z0-9]。這是否改變了?

2

這裏是我的代碼,這樣做:

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>'; 
     }); 
} 

這裏是它在行動演示:http://siliconsparrow.com/javascripttwittertest.html

+0

OP也要鏈接 – jeremy