Twitter #hashtag, @kullanici ve url biçimlendirme

Twitter, Friendfeed gibi sosyal ağlarda bir şeyi etikletlemek istediğimizde #(diyez) işaretiyle başlayarak etiketimizi yazabiliyoruz, buna hashtag (#etiketimiz) deniyor. Twitter’ da @ işaretiyle başlayıp herhangi bir kullanıcının adını yazdığımızda (@apostylee) o kullanıcıya bir uyarı gidiyor ve ekranda biz bu girdiyi kullanıcının profiline giden bir link olarak görüyoruz. Konuyla ilgili geçenlerde şöyle bir şey paylaşmıştım. Bu iki özelliğe ek olarak http:// yada www. ile başlayan bir girdi yaptığımızda otomatik olarak linke dönüştürülüyor. Bu olay yaptığım bir projede lazım olmuştu, hazır yapılmışı varmı diye ararken burada ki kodları buldum. İş sadece biçimlendirmeyle bitmiyor, eğer Twitter’ da ki gibi ilgili kullanıcıya bir bilgi vermemiz gerekirse o kullanıcı adına sahip olmamız gerekiyor, bu işi ufak bir regex kullanarak hallediyoruz. Örneklere bakınca demek istediğimi daha iyi anlayacaksınız. Önce girdiyi biçimlendiren kodlarımız;

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

namespace WebApplication2
{
    public static class HtmlParser
    {
        public static List hashTagList(string s) {
            Regex tags = new Regex(@"(?:(?            List l = new List();
            foreach (Match item in tags.Matches(s))
            {
                l.Add(item.Groups[1].ToString());
            }
            return l;
        }

        public static List userNameList(string s)
        {
            Regex tags = new Regex(@"(?:(?            List l = new List();
            foreach (Match item in tags.Matches(s))
            {
                l.Add(item.Groups[1].ToString());
            }
            return l;
        }

        public static string Link(this string s, string url)
        {
            return string.Format("<a href="\&quot;{0}\&quot;" target="\&quot;_blank\&quot;">{1}</a>", url, s);
        }
        public static string ParseURL(this string s)
        {
            return Regex.Replace(s, @"(http(s)?://)?([\w-]+\.)+[\w-]+(/\S\w[\w- ;,./?%&=]\S*)?", new MatchEvaluator(HtmlParser.URL));
        }
        public static string ParseUsername(this string s)
        {
            return Regex.Replace(s, "(@)((?:[A-Za-z0-9-_]*))", new MatchEvaluator(HtmlParser.Username));
        }
        public static string ParseHashtag(this string s)
        {
            return Regex.Replace(s, "(#)((?:[A-Za-z0-9-_]*))", new MatchEvaluator(HtmlParser.Hashtag));
        }
        private static string Hashtag(Match m)
        {
            string x = m.ToString();
            string tag = x.Replace("#", "");
            return x.Link("http://www.alanadi.com/tag/" + tag);
        }
        private static string Username(Match m)
        {
            string x = m.ToString();
            string username = x.Replace("@", "");
            return x.Link("http://www.alanadi.com/" + username);
        }
        private static string URL(Match m)
        {
            string x = m.ToString();
            return x.Link(x);
        }
    }
}

Örnek kullanım ise şu şekilde;

        protected void Page_Load(object sender, EventArgs e)
        {
            string strCumle = "selam @apostylee @ferdinand @drogma, nasılsın bakalım ? #tag #tag2 http://www.apostylee.com www.alanadi.com";

            Response.Write(strCumle.ParseURL().ParseUsername().ParseHashtag()+"</pre>

<hr />

<pre>
");

            Response.Write(HtmlParser.userNameList(strCumle).Count+"</pre>

<hr />

<pre>
");

            foreach (var item in HtmlParser.userNameList(strCumle))
            {
                Response.Write(item+"
");
            }
        }

HtmlParser.userNameList() ve HtmlParser.hashTagList() methodları bize ilgili girdideki kullanıcı adlarının yada etiketlerin listesini döndürüyor. Yukarıda da bahsettiğim gibi eğer veritabanına yazmamız gereken bir durum varsa bu iki methodun bize döndürdüğü listeyi kullanıyoruz. Projenin çalışır halini buradan indirebilirsiniz. Umarım faydalı bir yazı olmuştur..