我正在使用LinqToTwitter API处理twitter API。在那里,我试图格式化推文文本。但是我有替换和下面的正则表达式的问题是我从twitter获得的字符串
@TheNational: ICYMI: Louvre be first museum in Asia to show a painting http://t.co/fmp http://t.c…
现在我使用下面的代码将所有URL替换为Link以进行显示。
首先我创建正则表达式来获取链接
private readonly Regex _parseUrls = new Regex("(?<Protocol>\\w+):\\/\\/(?<Domain>[\\w@][\\w.:@]+)\\/?[\\w\\.?=%&=\\-@/$,]*", 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
开头,每次都会替换它。
有人帮助我,我失踪了。
答案 0 :(得分: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))
);
例如,这会将网址中的&
转为&
标记内的<a>
。你甚至应该对字符串的剩余部分进行编码:如果某人发布了一些HTML代码,你就要按原样显示它而不是解释它。
原始方法的问题是_parseUrls.Matches(tweetText)
会在每次迭代时再次匹配替换的文本。