Форматирование текста Twitter (TweetText) с помощью С#
Есть ли лучший способ форматировать текст из Twitter, чтобы связать гиперссылки, имя пользователя и хэштеги? У меня работает, но я знаю, что это можно сделать лучше. Меня интересуют альтернативные методы. Я устанавливаю это как HTML-помощник для ASP.NET MVC.
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;
}
}
}
Ответы
Ответ 1
Это очень похоже на код, который я написал, который отображает мой статус Twitter в моем блоге. Единственное, что я делаю, что я делаю, это
1), посмотрев @name
и заменив его на <a href="http://twitter.com/name">Real Name</a>
;
2) несколько @name
в строке получают запятые, если они не имеют их;
3) Твиты, начинающиеся с @name(s)
, отформатированы "To @name:".
Я не вижу причин, по которым это не может быть эффективным способом анализа твитов - это очень согласованный формат (хорошо для регулярного выражения), и в большинстве ситуаций скорость (миллисекунды) более чем приемлема.
Edit:
Вот код для моего синтаксиса Tweet. Это слишком долго, чтобы добавить ответ на переполнение стека. Требуется твит, например:
@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>
Он также включает всю эту разметку в немного JavaScript:
document.getElementById('twitter').innerHTML = '{markup}';
Таким образом, читсет может запускаться асинхронно как JS, и если Twitter не работает или замедляется, это не повлияет на время загрузки страницы сайта.
Ответ 2
Я создал вспомогательный метод для сокращения текста до 140 символов с включенным url. Вы можете установить длину до 0, чтобы исключить URL из твита.
public static string FormatTwitterText(this string text, string shareurl)
{
if (string.IsNullOrEmpty(text))
return string.Empty;
string finaltext = string.Empty;
string sharepath = string.Format("http://url.com/{0}", shareurl);
//list of all words, trimmed and new space removed
List<string> textlist = text.Split(' ').Select(txt => Regex.Replace(txt, @"\n", "").Trim())
.Where(formatedtxt => !string.IsNullOrEmpty(formatedtxt))
.ToList();
int extraChars = 3; //to account for the two dots ".."
int finalLength = 140 - sharepath.Length - extraChars;
int runningLengthCount = 0;
int collectionCount = textlist.Count;
int count = 0;
foreach (string eachwordformated in textlist
.Select(eachword => string.Format("{0} ", eachword)))
{
count++;
int textlength = eachwordformated.Length;
runningLengthCount += textlength;
int nextcount = count + 1;
var nextTextlength = nextcount < collectionCount ?
textlist[nextcount].Length :
0;
if (runningLengthCount + nextTextlength < finalLength)
finaltext += eachwordformated;
}
return runningLengthCount > finalLength ? finaltext.Trim() + ".." : finaltext.Trim();
}
Ответ 3
Есть хороший ресурс для разбора сообщений Twitter этой ссылки, работал у меня:
Как анализировать имена пользователей, хэш-теги и URL-адреса Twitter в С# 3.0
http://jes.al/2009/05/how-to-parse-twitter-usernames-hashtags-and-urls-in-c-30/
Он содержит поддержку:
- Urls
- #hashtags
- @usernames
BTW: Regex в методе ParseURL() нуждается в просмотре, он анализирует символы запаса (BARC.L) в ссылках.