2014-12-06 84 views
1

我在使用LinqToTwitter API的twitter API。我正在尝试格式化tweet文字。但是我有一个问题,更换和下面的正则表达式是我从Twitter替换和RegEx问题

@TheNational: ICYMI: Louvre be first museum in Asia to show a painting http://t.co/fmp http://t.c…

让我现在用下面的代码替换所有的URL链接,显示的字符串。

首先,我创建正则表达式来获取链接

private readonly Regex _parseUrls = new Regex("(?<Protocol>\\w+):\\/\\/(?<Domain>[\\[email protected]][\\w.:@]+)\\/?[\\w\\.?=%&=\\[email protected]/$,]*", RegexOptions.IgnoreCase | RegexOptions.Compiled); 

然后,我与它们匹配和替换如下

foreach (var urlMatch in _parseUrls.Matches(tweetText)) 
    { 
    Match match = (Match)urlMatch; 
    tweetText = tweetText.Replace(match.Value, string.Format("<a href=\"{0}\" target=\"_blank\">{0}</a>", match.Value)); 
    } 

正则表达式按预期工作非常好,但现在取而代之的是给问题,因为在这两个环节字符串以http://t.co开头,每次都替换第一次出现。

有人帮助我,我失踪了。

回答

1

这不是一个正确的方法来做替换。

使用Regex.Replace方法:

_parseUrls.Replace(tweetText, "<a href=\"$&\" target=\"_blank\">$&</a>"); 

或者,更好的是,与HTML编码:

_parseUrls.Replace(tweetText, 
        match => string.Format("<a href=\"{0}\" target=\"_blank\">{1}</a>", 
              match.Value, 
              WebUtility.HtmlEncode(match.Value)) 
       ); 

这将为例如把任何&在URL中&amp;<a>标签内。你甚至应该对字符串的其余部分进行编码:如果有人推送了一些HTML代码,你希望按原样显示它,而不是解释它。

与原有方法的问题是,_parseUrls.Matches(tweetText)替换文本再次每次迭代匹配。

+0

你解决了我的大问题非常感谢你 – Milind 2014-12-06 14:59:41