C#正则实现Ubb解析类的代码

2016-02-19 13:14 46 1 收藏

生活已是百般艰难,为何不努力一点。下面图老师就给大家分享C#正则实现Ubb解析类的代码,希望可以让热爱学习的朋友们体会到设计的小小的乐趣。

【 tulaoshi.com - Web开发 】

解析得到的代码能通过XHTML 1.0 STRICT验证;
包含了标题,链接,字体,对齐,图片,引用,列表等方面的功能. 
Ubb.ReadMe.htm

代码如下:

//作者:deerchao 
// http://www.unibetter.com/blogs/blogdeerchao/default.aspx 
//在不移除以上(及本条)注释的前提下,任何人可以以任何方式使用此代码. 

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

namespace Deerchao.Web 

    public class UbbDecoder 
    { 
        private static readonly RegexOptions options = RegexOptions.Compiled | RegexOptions.Singleline; 

        /// summary 
        /// 解析Ubb代码为Html代码 
        /// /summary 
        /// param name="ubb"Ubb代码/param 
        /// returns解析得到的Html代码/returns 
        public static string Decode(string ubb) 
        { 
            if (string.IsNullOrEmpty(ubb)) 
                return null; 
            string result = ubb; 
            result = HttpUtility.HtmlEncode(result); 

            result = DecodeStyle(result); 
            result = DecodeFont(result); 
            result = DecodeColor(result); 
            result = DecodeImage(result); 
            result = DecodeLinks(result); 
            result = DecodeQuote(result); 
            result = DecodeAlign(result); 
            result = DecodeList(result); 
            result = DecodeHeading(result); 
            result = DecodeBlank(result); 

            return result; 
        } 

        /// summary 
        /// 解析Ubb代码为Html代码,所有的链接为rel="nofollow" 
        /// /summary 
        /// param name="ubb"Ubb代码/param 
        /// returns解析得到的Html代码/returns 
        public static string DecodeNoFollow(string ubb) 
        { 
            if (string.IsNullOrEmpty(ubb)) 
                return null; 
            string result = ubb; 
            result = HttpUtility.HtmlEncode(result); 

            result = DecodeStyle(result); 
            result = DecodeFont(result); 
            result = DecodeColor(result); 
            result = DecodeImage(result); 
            result = DecodeLinksNoFollow(result); 
            result = DecodeQuote(result); 
            result = DecodeAlign(result); 
            result = DecodeList(result); 
            result = DecodeHeading(result); 
            result = DecodeBlank(result); 

            return result; 
        } 

        private static string DecodeHeading(string ubb) 
        { 
            string result = ubb; 
            result = Regex.Replace(result, @"[h(d)](.*?)[/h1]", "h$1$2/h$1", options); 
            return result; 
        } 

        private static string DecodeList(string ubb) 
        { 
            string sListFormat = "ol style="list-style:{0};"$1/ol"; 
            string result = ubb; 
            // Lists 
            result = Regex.Replace(result, @"[*]([^[]*)", "li$1/li", options); 
            result = Regex.Replace(result, @"[list]s*(.*?)[/list]", "ul$1/ul", options); 
            result = Regex.Replace(result, @"[list=1]s*(.*?)[/list]", string.Format(sListFormat, "decimal"), options); 
            result = Regex.Replace(result, @"[list=i]s*(.*?)[/list]", string.Format(sListFormat, "lower-roman"), options); 
            result = Regex.Replace(result, @"[list=I]s*(.*?)[/list]", string.Format(sListFormat, "upper-roman"), options); 
            result = Regex.Replace(result, @"[list=a]s*(.*?)[/list]", string.Format(sListFormat, "lower-alpha"), options); 
            result = Regex.Replace(result, @"[list=A]s*(.*?)[/list]", string.Format(sListFormat, "upper-alpha"), options); 

            return result; 
        } 

        private static string DecodeBlank(string ubb) 
        { 
            string result = ubb; 

            result = Regex.Replace(result, @"(?= ) | (?= )", " ", options); 
            result = Regex.Replace(result, @"rn", "br /"); 
            string[] blockTags = {"h[1-6]", "li", "list", "div", "p", "ul"}; 
            //clear br before block tags(start or end) 
            foreach (string tag in blockTags) 
            { 
                Regex r = new Regex("br /(" + tag + ")",options); 
                result = r.Replace(result, "$1"); 
                r = new Regex("br /(/" + tag + ")",options); 
                result = r.Replace(result, "$1"); 
            } 
            return result; 
        } 

        private static string DecodeAlign(string ubb) 
        { 
            string result = ubb; 

            result = Regex.Replace(result, @"[left](.*?)[/left]", "div style="text-align:left"$1/div", options); 
            result = Regex.Replace(result, @"[right](.*?)[/right]", "div style="text-align:right"$1/div", options); 
            result = Regex.Replace(result, @"[center](.*?)[/center]", "div style="text-align:center"$1/div", options); 

            return result; 
        } 

        private static string DecodeQuote(string ubb) 
        { 
            string result = ubb; 

            result = Regex.Replace(result, @"[quote]", "blockquotediv", options); 
            result = Regex.Replace(result, @"[/quote]", "/div/blockquote", options); 
            return result; 
        } 

        private static string DecodeFont(string ubb) 
        { 
            string result = ubb; 

            result = Regex.Replace(result, @"[size=([-w]+)](.*?)[/size]", "span style="font-size:$1"$2/span", options); 
            result = Regex.Replace(result, @"[font=(.*?)](.*?)[/font]", "span style="font-family:$1"$2/span", options); 
            return result; 
        } 

        private static string DecodeLinks(string ubb) 
        { 
            string result = ubb; 

            result = Regex.Replace(result, @"[url]www.(.*?)[/url]", "a href="http://www.$1"$1/a", options); 
            result = Regex.Replace(result, @"[url](.*?)[/url]", "a href="$1"$1/a", options); 
            result = Regex.Replace(result, @"[url=(.*?)](.*?)[/url]", "a href="$1" title="$2"$2/a", options); 
            result = Regex.Replace(result, @"[email](.*?)[/email]", "a href="mailto:$1"$1/a", options); 
            return result; 
        } 

        private static string DecodeLinksNoFollow(string ubb) 
        { 
            string result = ubb; 

            result = Regex.Replace(result, @"[url]www.(.*?)[/url]", "a rel="nofollow" href="http://www.$1"$1/a", options); 
            result = Regex.Replace(result, @"[url](.*?)[/url]", "a rel="nofollow" href="$1"$1/a", options); 
            result = Regex.Replace(result, @"[url=(.*?)](.*?)[/url]", "a rel="nofollow" href="$1" title="$2"$2/a", options); 
            result = Regex.Replace(result, @"[email](.*?)[/email]", "a href="mailto:$1"$1/a", options); 
            return result; 
        } 

        private static string DecodeImage(string ubb) 
        { 
            string result = ubb; 

            result = Regex.Replace(result, @"[hr]", "hr /", options); 
            result = Regex.Replace(result, @"[img](.+?)[/img]", "img src="$1" alt="" /", options); 
            result = Regex.Replace(result, @"[img=(d+)x(d+)](.+?)[/img]", "img src="$3" style="width:$1px;height:$2px" alt="" /", options); 

            return result; 
        } 

        private static string DecodeColor(string ubb) 
        { 
            string result = ubb; 
            result = Regex.Replace(result, @"[color=(#?w+?)](.+?)[/color]", "span style="color:$1"$2/span",options); 

            return result; 
        } 

        private static string DecodeStyle(string ubb) 
        { 
            string result=ubb; 
            //we don't need this for perfomance and other consideration: 
            //(table[^]*(?table[^]*(?Depth)|/table(?-Depth)|.)+(?(Depth)(?!))/table) 
            result = Regex.Replace(result, @"[[b]](.*?)[/[b]]", "strong$1/strong", options); 
            result = Regex.Replace(result, @"[[u]](.*?)[/[u]]", "span style="text-decoration:underline"$1/span", options); 
            result = Regex.Replace(result, @"[[i]](.*?)[/[i]]", "i$1/i", options); 

            return result; 
        } 
    } 

来源:http://www.tulaoshi.com/n/20160219/1603431.html

延伸阅读
1. 概述 有时候我们需要在web页面上显示一张图,比如说一张地图,而这张地图会比较大。这时候如果我们把一张大图分隔成一组小图,那么客户端的显示速度会明显地感觉块。希望阅读本文对你有所帮助。 2. 实现思路 .NET Framework GDI+ 为我们提供了一组丰富地类来编辑图形图像。有关.NET Framework GDI+的...
先引用using System.Runtime.InteropServices; 的命名空间, 然后在合适的位置加上如下代码就OK。。注意:Form1_Load和Form1_FormClosed不能直接copy哦~ 代码如下: [DllImport("user32")] public static extern bool RegisterHotKey(IntPtr hWnd,int id,uint control,Keys vk ); //注册热键的api [DllImport("user32")] public static e...
using System;using System.DirectoryServices; //要增加此DLL文件 private void button3_Click(object sender, System.EventArgs e) { try { DirectoryEntry AD = new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer"); DirectoryEntry NewUser = AD.Children.Add("TestUser1", "use...
标签: Web开发
用 Javascript 解析链接(URL)是一个常见的需求,本文介绍了一个非常健全的用 Javascript 写的链接(URL)解析类,他可以准确获取一个完整的 URL 中每个部分的内容,包括协议、URL中包含的用户名和密码、主机名、端口、路径名、参数、锚点(Fragment Anchor)等信息。  [Ctrl+A 全选 注:如需引...
Java 5之后提供优秀的并发库util.concurrent,.Net中缺乏类似的功能。由于硬件体系发生了变化,多核时代来临,.NET中缺乏并发类库显然不合时宜。缓解这一矛盾的其中一个办法就是在往 C# 中移植java的 util.concurrent 。 java中的util.concurrent包中提供了一个类LockSupport,util.concurrent包很多关键实现需要调用LockSupport。...

经验教程

618

收藏

51
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部