正则表达式如何替换twitter链接

时间:2011-11-05 14:19:38

标签: javascript regex

请帮我正则表达。

我发现这个代码很和平:

    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>因此正则表达式无效(我想我需要将此字符“&lt;”和“&gt;”附加到“at function”。但是如何?)

在我的页面中的“哈希”函数中的第二个,在查询中可以有其他非a-zA-Z字符)。例如“такиесимволы”或“ñ”或其他。对于#<a href="twitter.com/?q=Catalu">Catalu</a>ña

,格式化字符串看起来像#Cataluña

请帮帮我。谢谢!

3 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分: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

答案 2 :(得分:0)

正则表达式以/(^|\s+)开头,这意味着只有当它位于文档的开头或者前面有空格时才匹配@foo

然后正则表达式只匹配字母,数字和下划线。

也许你应该使匹配不那么严格,并匹配一系列不是空格的字符,比如\@(!\s){1,15}\s,虽然我不确定这些unicode字符是否甚至在Twitter名称中被允许。很多文件只提到[A-Za-z0-9]。这改变了吗?