使用C#格式化Twitter文本(TweetText)

Bre*_*nan 12 c# twitter asp.net-mvc

有没有更好的方法从Twitter格式化文本链接超链接,用户名和主题标签?我所拥有的是工作,但我知道这可以做得更好.我对替代技术感兴趣.我将其设置为ASP.NET MVC的HTML Helper.

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Mvc;

namespace Acme.Mvc.Extensions
{

    public static class MvcExtensions
    {
        const string ScreenNamePattern = @"@([A-Za-z0-9\-_&;]+)";
        const string HashTagPattern = @"#([A-Za-z0-9\-_&;]+)";
        const string HyperLinkPattern = @"(http://\S+)\s?";

        public static string TweetText(this HtmlHelper helper, string text)
        {
            return FormatTweetText(text);
        }

        public static string FormatTweetText(string text)
        {
            string result = text;

            if (result.Contains("http://"))
            {
                var links = new List<string>();
                foreach (Match match in Regex.Matches(result, HyperLinkPattern))
                {
                    var url = match.Groups[1].Value;
                    if (!links.Contains(url))
                    {
                        links.Add(url);
                        result = result.Replace(url, String.Format("<a href=\"{0}\">{0}</a>", url));
                    }
                }
            }

            if (result.Contains("@"))
            {
                var names = new List<string>();
                foreach (Match match in Regex.Matches(result, ScreenNamePattern))
                {
                    var screenName = match.Groups[1].Value;
                    if (!names.Contains(screenName))
                    {
                        names.Add(screenName);
                        result = result.Replace("@" + screenName,
                           String.Format("<a href=\"http://twitter.com/{0}\">@{0}</a>", screenName));
                    }
                }
            }

            if (result.Contains("#"))
            {
                var names = new List<string>();
                foreach (Match match in Regex.Matches(result, HashTagPattern))
                {
                    var hashTag = match.Groups[1].Value;
                    if (!names.Contains(hashTag))
                    {
                        names.Add(hashTag);
                        result = result.Replace("#" + hashTag,
                           String.Format("<a href=\"http://twitter.com/search?q={0}\">#{1}</a>",
                           HttpUtility.UrlEncode("#" + hashTag), hashTag));
                    }
                }
            }

            return result;
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

Rex*_*x M 3

这与我编写的在博客上显示我的 Twitter 状态的代码非常相似。我所做的唯一进一步的事情是

1)查找@name并替换为<a href="http://twitter.com/name">Real Name</a>

2)@name连续出现多个逗号,如果没有逗号;

3) 以开头的推文@name(s)格式为“To @name:”。

我不认为这不能成为解析推文的有效方法 - 它们是非常一致的格式(适合正则表达式),并且在大多数情况下,速度(毫秒)是可以接受的。

编辑:

这是我的推文解析器的代码。放入 Stack Overflow 答案有点太长了。它需要一条推文,例如:

@user1 @user2 查看我从 @user3 获得的这个很酷的链接:http://url.com/page.htm#anchor #coollinks

并将其变成:

<span class="salutation">
    To <a href="http://twitter.com/user1">Real Name</a>,
    <a href="http://twitter.com/user2">Real Name</a>:
</span> check out this cool link I got from
<span class="salutation">
    <a href="http://www.twitter.com/user3">Real Name</a>
</span>:
<a href="http://site.com/page.htm#anchor">http://site.com/...</a>
<a href="http://twitter.com/#search?q=%23coollinks">#coollinks</a>
Run Code Online (Sandbox Code Playgroud)

它还将所有标记包装在一些 JavaScript 中:

document.getElementById('twitter').innerHTML = '{markup}';
Run Code Online (Sandbox Code Playgroud)

这样推文获取器就可以作为 JS 异步运行,并且如果 Twitter 关闭或变慢,也不会影响我网站的页面加载时间。

  • 链接失效了,有机会重新贴一下代码吗?胃肠道间质瘤或其他地方 (3认同)