12
votes

Formater Twitter Text (TweetText) avec C #

Y a-t-il un meilleur moyen de formater du texte de Twitter pour relier les hyperliens, le nom d'utilisateur et les hashtags? Ce que j'ai travaille, mais je sais que cela pourrait être fait mieux. Je suis intéressé par des techniques alternatives. Je me présente comme une aide HTML pour 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 commentaires

const String HyperlinkPattern = @ "(http (s)?: // \ s +) \ s?"; // support https aussi


3 Réponses :


3
votes

Cela ressemble remarquablement au code que j'ai écrit qui affiche mon statut Twitter sur mon blog. Les seules autres choses que je fais que je fais est

1) recherche up @name code> et le remplace par réel Nom code>; p>

2) multiple @name code> s dans une ligne GET COMMAS, si elles ne les ont pas; P> 3) Tweets qui commencent par @name (s) code> sont formatés "à @Name:". P>

Je ne vois aucune raison pour ne pas être efficace. façon d'analyser un tweet - ils constituent un format très cohérent (bon pour regex) et dans la plupart des situations, la vitesse (millisecondes) est plus que acceptable. P>

EDIT: P>

Voici le code de mon analyseur Tweet. C'est un peu trop long pour mettre dans une pile surplaçance. Il faut un tweet comme: P>

user1 @ user2 Découvrez ce lien cool I obtenu de @ user3: HTTP: // URL. com / page.htm # ancre #Collinks p> blockquote>

et la transformer en: p>

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


10 commentaires

J'ai un problème avec mon code si une URL a un caractère de hachage. J'ai essayé d'utiliser \ B pour définir les frontières du mot, mais cela ne fonctionne pas. Je ne suis pas sûr que l'exemple de Django fonctionnera pour moi en C # mais je l'essaie de sortir.


@Brennan aussi loin que je peux dire, les hashtags peuvent être alphanumériques. Capturez d'abord les URL (de cette façon, vous attrapez des URL avec #), puis exécutez votre réégalité HASHTAG sur les fragments qui n'étaient pas ramassés par le remplaceur d'URL.


Je ne sais pas comment faire ça avec regex en C #. Avez-vous un exemple?


@Brennan voici une manière encore meilleure - (? doit correspondre à n'importe quel # suivi de 1 ou plus caractères alphanumériques lorsqu'il n'est pas précédé de: // et de tout nombre de caractères qui n'est pas un espace. Cela devrait correspondre à tous les hashtags, mais tout # à l'intérieur d'une URL échouera.


Ça vous dérange si j'utilise cela? Je suppose que vous ne le faites pas que vous l'avez posté comme une réponse, mais que vous vouliez simplement vérifier. Aussi, qui devrais-je créer dans les commentaires?


@Chance S'il vous plaît n'hésitez pas à l'utiliser, créditer moi si vous le souhaitez, mais ce n'est pas nécessaire.


@Rex plus General URIS serait plus agréable: [A-ZA-Z0-9 \ -_] *: [^ \ w] * - E.G. Appel-to: foo. De plus, vos trucs sont ouverts à XSS; Vous devriez httTputilité.htmlencode () sur tout texte inséré (en particulier les HREFS).


@Jonathan Techniquement vrai, mais cela n'est pas destiné à être une solution à balle. La balance coûts-avantages me pousse à faire confiance à une entrée de Twitter et ne prend en charge que les URL.


@Rex Twitter a eu des XSS virales (ils se retweetteraient eux-mêmes) Tweets flottant autour de cette faille exacte de la sécurité :).


Le lien est cassé, toute chance au code de repousse? Gist ou quelque part



0
votes

J'ai créé la méthode d'assistance pour raccourcir le texte à 140 caractères avec URL inclus. Vous pouvez définir la longueur de partage sur 0 pour exclure l'URL de 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 commentaires

0
votes

Il y a une bonne ressource pour analyser les messages Twitter Ce lien a fonctionné pour moi:

Comment analyser les noms d'utilisateur Twitter, les hashtags et les URL en C # 3.0

http : //jes.al/2009/05/how-to-parse-Twitter-Usernames-hashags-and-urls-in-c-30/

Il contient le support pour:

  • URLS
  • #hashtags
  • @ sursernames

    BTW: regex dans la méthode ParseurL () Conditions requises, il analyse des symboles de stock (barc.l) dans les liens.


0 commentaires