2009-07-27 33 views
12

Có cách nào tốt hơn để định dạng văn bản từ Twitter để liên kết các siêu liên kết, tên người dùng và thẻ bắt đầu bằng # không? Những gì tôi có đang làm việc nhưng tôi biết điều này có thể được thực hiện tốt hơn. Tôi quan tâm đến các kỹ thuật thay thế. Tôi đang thiết lập này như là một trợ giúp HTML cho ASP.NET MVC.Định dạng văn bản Twitter (TweetText) bằng C#

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

    } 

} 
+0

const chuỗi HyperLinkPattern = @ "(http (s)?: // \ S +) \ s?"; // Hỗ trợ https cũng – NetProvoke

Trả lời

3

Điều này khá giống với mã tôi đã viết hiển thị trạng thái Twitter trên blog của mình. Điều duy nhất tôi làm mà tôi làm là

1) tra cứu @name và thay thế bằng <a href="http://twitter.com/name">Real Name</a>;

2) nhiều hàng @name liên tiếp nhận được dấu phẩy, nếu chúng không có chúng;

3) Tweet bắt đầu bằng @name(s) được định dạng "To @name:".

Tôi không thấy lý do nào không thể là một cách hiệu quả để phân tích một tweet - chúng là một định dạng rất nhất quán (tốt cho regex) và trong hầu hết các trường hợp tốc độ (mili giây) lớn hơn chấp nhận được.

Edit:

Here is the code for my Tweet parser. Đó là một chút quá dài để đưa vào một câu trả lời Stack Overflow. Phải mất một tweet như:

@ user1 user2 @ kiểm tra liên kết này mát mẻ tôi nhận được từ @ User3: http://url.com/page.htm#anchor #coollinks

Và biến nó thành:

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

Nó cũng kết thúc tốt đẹp tất cả đánh dấu đó bằng một JavaScript nhỏ:

document.getElementById('twitter').innerHTML = '{markup}'; 

Đây là trình tìm nạp tweet có thể chạy không đồng bộ dưới dạng JS và nếu Twitter giảm hoặc chậm, nó sẽ không ảnh hưởng đến thời gian tải trang của trang web của tôi.

+0

Tôi gặp sự cố với mã của mình nếu URL có ký tự băm. Tôi đã thử sử dụng \ b để xác định ranh giới từ nhưng điều đó không hoạt động. Tôi không chắc chắn nếu ví dụ Django sẽ làm việc cho tôi trong C# nhưng tôi đang cố gắng nó ra. – Brennan

+0

@Brennan theo như tôi có thể nói, Hashtags có thể là chữ và số. Nắm bắt các URL đầu tiên (theo cách đó bạn bắt bất kỳ URL nào bằng #), sau đó chạy hashtag regex của bạn trên các đoạn không được chọn bởi trình thay thế URL. –

+0

Tôi không chắc chắn làm thế nào để làm điều đó với Regex trong C#. Bạn có một ví dụ? – Brennan

0

Tôi đã tạo phương thức trợ giúp để rút ngắn văn bản thành 140 ký tự có chứa url. Bạn có thể đặt độ dài chia sẻ thành 0 để loại trừ url khỏi tweet.

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(); 
    } 
0

Có là một nguồn lực tốt để phân tích Twitter thông điệp liên kết này, làm việc cho tôi:

Làm thế nào để phân tích Twitter Tên người dùng, hashtags và URL trong C# 3,0

http://jes.al/2009/05/how-to-parse-twitter-usernames-hashtags-and-urls-in-c-30/

Nó chứa hỗ trợ cho:

  • url
  • #hashtags
  • @usernames

BTW: Regex trong ParseURL() phương pháp cần rà soát, nó phân tích những biểu tượng cổ phiếu (BARC.L) thành liên kết.

Các vấn đề liên quan