//作者: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;
///
/// 解析Ubb代码为Html代码
/// ///
Ubb代码
///
解析得到的Html代码 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;
}
///
/// 解析Ubb代码为Html代码,所有的链接为rel="nofollow"
/// ///
Ubb代码
///
解析得到的Html代码 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)\](.*?)\[/h\1\]", "
$2", options);
return result;
}
private static string DecodeList(string ubb)
{
string sListFormat = "
$1
";
string result = ubb;
// Lists
result = Regex.Replace(result, @"\[\*\]([^\[]*)", "
$1", options);
result = Regex.Replace(result, @"\[list\]\s*(.*?)\[/list\]", "
", 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, @"\r\n", "
");
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("
(<" + tag + ")",options);
result = r.Replace(result, "$1");
r = new Regex("
(" + tag + ")",options);
result = r.Replace(result, "$1");
}
return result;
}
private static string DecodeAlign(string ubb)
{
string result = ubb;
result = Regex.Replace(result, @"\[left\](.*?)\[/left\]", "
$1
", options);
result = Regex.Replace(result, @"\[right\](.*?)\[/right\]", "
$1
", options);
result = Regex.Replace(result, @"\[center\](.*?)\[/center\]", "
$1
", options);
return result;
}
private static string DecodeQuote(string ubb)
{
string result = ubb;
result = Regex.Replace(result, @"\[quote\]", "
", options);
result = Regex.Replace(result, @"\[/quote\]", "
", options);
return result;
}
private static string DecodeFont(string ubb)
{
string result = ubb;
result = Regex.Replace(result, @"\[size=([-\w]+)\](.*?)\[/size\]", "
$2", options);
result = Regex.Replace(result, @"\[fOnt=(.*?)\](.*?)\[/font\]", "
$2", options);
return result;
}
private static string DecodeLinks(string ubb)
{
string result = ubb;
result = Regex.Replace(result, @"\[url\]www\.(.*?)\[/url\]", "
$1", options);
result = Regex.Replace(result, @"\[url\](.*?)\[/url\]", "
$1", options);
result = Regex.Replace(result, @"\[url=(.*?)\](.*?)\[/url\]", "
$2", options);
result = Regex.Replace(result, @"\[email\](.*?)\[/email\]", "
$1", options);
return result;
}
private static string DecodeLinksNoFollow(string ubb)
{
string result = ubb;
result = Regex.Replace(result, @"\[url\]www\.(.*?)\[/url\]", "
$1", options);
result = Regex.Replace(result, @"\[url\](.*?)\[/url\]", "
$1", options);
result = Regex.Replace(result, @"\[url=(.*?)\](.*?)\[/url\]", "
$2", options);
result = Regex.Replace(result, @"\[email\](.*?)\[/email\]", "
$1", options);
return result;
}
private static string DecodeImage(string ubb)
{
string result = ubb;
result = Regex.Replace(result, @"\[hr\]", "
", options);
result = Regex.Replace(result, @"\[img\](.+?)\[/img\]", "
", options);
result = Regex.Replace(result, @"\[img=(\d+)x(\d+)\](.+?)\[/img\]", "
", options);
return result;
}
private static string DecodeColor(string ubb)
{
string result = ubb;
result = Regex.Replace(result, @"\[color=(#?\w+?)\](.+?)\[/color\]", "
$2",options);
return result;
}
private static string DecodeStyle(string ubb)
{
string result=ubb;
//we don't need this for perfomance and other consideration:
//(
]*>(?>(?<-Depth>)|.)+(?(Depth)(?!))
)
result = Regex.Replace(result, @"\[[b]\](.*?)\[/[b]\]", "
$1", options);
result = Regex.Replace(result, @"\[[u]\](.*?)\[/[u]\]", "
$1", options);
result = Regex.Replace(result, @"\[[i]\](.*?)\[/[i]\]", "
$1", options);
return result;
}
}
}