当前位置: 首页 > 图文教程 > 网络编程 > 正则表达式 > C#正则实现Ubb解析类的代码

正则表达式
RegExp对象的方法和属性
asp正则过滤重复字符串的代码
用Javascript正则实现url链接的解析类
正则表达式匹配 非XXX的行
正则表达式不包含属性
ASP正则函数替换分页后的参数
asp match正则函数使用Matchs实例
java正则表达式彻底研究
比较实用的正则表达式学习笔记
asp只采集网站可见文本的正则
asp.net常用正则表达式
js验证email的正则
java正则表达式验证函数
java 字符串匹配函数
js取得参数代码
Further Study of Rugular Expresions
正则表达式之全部符号对照表
正则文本框只能输入正整数
正则表达式在线测试工具
正则表达式提取网址、标题、图片等一例(.Net Asp Javascript/Js)的实现

正则表达式 中的 C#正则实现Ubb解析类的代码


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 109 ::
收藏到网摘: n/a

解析得到的代码能通过XHTML 1.0 STRICT验证;
包含了标题,链接,字体,对齐,图片,引用,列表等方面的功能.
Ubb.ReadMe.htm
点击运行可以看到效果:
[Ctrl+A 全选 提示:你可先修改部分代码,再按运行]

复制代码 代码如下:

//作者: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)\](.*?)\[/h\1\]", "<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, @"\r\n", "<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\]", "<blockquote><div>", 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;
}
}
}