最近我又开始用c#做论坛,在网上找了一下,虽然也有关于ubb(c#)的转换代码,可是同样都不全面,我在这里补充了一下,拿出来和大家共享。
有什么问题到我个人的论坛[url=http://www.hushiyu.com]www.hushiyu.com[/url]来交流,随时欢迎。
using System;
using System.Text;
using System.Text.RegularExpressions;
namespace myluntan
{
///
1<summary>
2/// UBB 的摘要说明。
3/// </summary>
public class UBB
{
public UBB()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
#region 公共静态方法
///
1<summary>
2/// UBB代码处理函数
3/// </summary>
///
1<param name="sDetail"/>
输入字符串
///
1<returns>输出字符串</returns>
public string UBBToHTML(string sDetail)
{
Regex r;
Match m;
#region 处理空格
sDetail = sDetail.Replace(" "," ");
#endregion
#region 处理单引号
sDetail = sDetail.Replace("'","’");
#endregion
#region 处理双引号
sDetail = sDetail.Replace(""",""");
#endregion
#region html标记符
sDetail = sDetail.Replace("<","<");
sDetail = sDetail.Replace(">",">");
#endregion
#region 处理换行
//处理换行,在每个新行的前面添加两个全角空格
r = new Regex(@"(\r\n(( )| )+)(?<正文>\S+)",RegexOptions.IgnoreCase);
for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
{
sDetail = sDetail.Replace(m.Groups[0].ToString(),"
1<br/>
" + m.Groups["正文"].ToString());
}
//处理换行,在每个新行的前面添加两个全角空格
sDetail = sDetail.Replace("\r\n","
1<br/>
");
#endregion
#region 处[b][/b]标记
r = new Regex(@"(\[b\])([ \S\t]*?)(\[/b\])",RegexOptions.IgnoreCase);
for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
{
sDetail = sDetail.Replace(m.Groups[0].ToString(),"
1<b>" + m.Groups[2].ToString() + "</b>
");
}
#endregion
#region 处[i][/i]标记
r = new Regex(@"(\[i\])([ \S\t]*?)(\[/i\])",RegexOptions.IgnoreCase);
for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
{
sDetail = sDetail.Replace(m.Groups[0].ToString(),"
1<i>" + m.Groups[2].ToString() + "</i>
");
}
#endregion
#region 处[u][/u]标记
r = new Regex(@"(\[U\])([ \S\t]*?)(\[/U\])",RegexOptions.IgnoreCase);
for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
{
sDetail = sDetail.Replace(m.Groups[0].ToString(),"
1<u>" + m.Groups[2].ToString() + "</u>
");
}
#endregion
#region 处[p][/p]标记
//处[p][/p]标记
r = new Regex(@"((\r\n)\[p\])(.?)((\r\n)*\[/p\])",RegexOptions.IgnoreCase|RegexOptions.Singleline);
for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
{
sDetail = sDetail.Replace(m.Groups[0].ToString(),"
1<p class='\"pstyle\"'>" + m.Groups[3].ToString() + "</p>
");
}
#endregion
#region 处[sup][/sup]标记
//处[sup][/sup]标记
r = new Regex(@"(\[sup\])([ \S\t]*?)(\[/sup\])",RegexOptions.IgnoreCase);
for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
{
sDetail = sDetail.Replace(m.Groups[0].ToString(),"
1<sup>" + m.Groups[2].ToString() + "</sup>
");
}
#endregion
#region 处[sub][/sub]标记
//处[sub][/sub]标记
r = new Regex(@"(\[sub\])([ \S\t]*?)(\[/sub\])",RegexOptions.IgnoreCase);
for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
{
sDetail = sDetail.Replace(m.Groups[0].ToString(),"
1<sub>" + m.Groups[2].ToString() + "</sub>
");
}
#endregion
#region 处[url][/url]标记
//处[url][/url]标记
r = new Regex(@"(\[url\])([ \S\t]*?)(\[/url\])",RegexOptions.IgnoreCase);
for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
{
sDetail = sDetail.Replace(m.Groups[0].ToString(),
"
1<a "\"="" +="" href='\""' m.groups[2].tostring()="" target='\"_blank\"'>" +
2m.Groups[2].ToString() + "</a>
");
}
#endregion
#region 处[url=xxx][/url]标记
//处[url=xxx][/url]标记
r = new Regex(@"(\[url=([ \S\t]+)\])([ \S\t]*?)(\[/url\])",RegexOptions.IgnoreCase);
for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
{
sDetail = sDetail.Replace(m.Groups[0].ToString(),
"
1<a "\"="" +="" href='\""' m.groups[2].tostring()="" target='\"_blank\"'>" +
2m.Groups[3].ToString() + "</a>
");
}
#endregion
#region 处[email][/email]标记
//处[email][/email]标记
r = new Regex(@"(\[email\])([ \S\t]*?)(\[/email\])",RegexOptions.IgnoreCase);
for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
{
sDetail = sDetail.Replace(m.Groups[0].ToString(),
"
1<a "\"="" +="" href='\"mailto:"' m.groups[2].tostring()="" target='\"_blank\"'>" +
2m.Groups[2].ToString() + "</a>
");
}
#endregion
#region 处[email=xxx][/email]标记
//处[email=xxx][/email]标记
r = new Regex(@"(\[email=([ \S\t]+)\])([ \S\t]*?)(\[/email\])",RegexOptions.IgnoreCase);
for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
{
sDetail = sDetail.Replace(m.Groups[0].ToString(),
"
1<a "\"="" +="" href='\"mailto:"' m.groups[2].tostring()="" target='\"_blank\"'>" +
2m.Groups[3].ToString() + "</a>
");
}
#endregion
#region 处[size=x][/size]标记
//处[size=x][/size]标记
r = new Regex(@"(\[size=([1-7])\])([ \S\t]*?)(\[/size\])",RegexOptions.IgnoreCase);
for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
{
sDetail = sDetail.Replace(m.Groups[0].ToString(),
"
1<font size=" + m.Groups[2].ToString() + ">" +
2m.Groups[3].ToString() + "</font>
");
}
#endregion
#region 处[color=x][/color]标记
//处[color=x][/color]标记
r = new Regex(@"(\[color=([\S]+)\])([ \S\t]*?)(\[/color\])",RegexOptions.IgnoreCase);
for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
{
sDetail = sDetail.Replace(m.Groups[0].ToString(),
"
1<font color=" + m.Groups[2].ToString() + ">" +
2m.Groups[3].ToString() + "</font>
");
}
#endregion
#region 处[font=x][/font]标记
//处[font=x][/font]标记
r = new Regex(@"(\[font=([\S]+)\])([ \S\t]*?)(\[/font\])",RegexOptions.IgnoreCase);
for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
{
sDetail = sDetail.Replace(m.Groups[0].ToString(),
"
1<font face=" + m.Groups[2].ToString() + ">" +
2m.Groups[3].ToString() + "</font>
");
}
#endregion
#region 处理图片链接
//处理图片链接
r = new Regex(" \\picture\\\\[\/picture\\]",RegexOptions.IgnoreCase );
for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
{
sDetail = sDetail.Replace(m.Groups[0].ToString(),
"
1<a "\"="" +="" href='\"ShowImage.aspx?Type=ALL&Action=forumImage&ImageID="' m.groups[1].tostring()="" target='\"_blank\"'><img "\"="" +="" border="0" m.groups[1].tostring()="" src='\"ShowImage.aspx?Action=forumImage&ImageID="' title='\"点击打开新窗口查看\"'/></a>
");
}
#endregion
#region 处理[align=x][/align]
//处理[align=x][/align]
r = new Regex(@"(\[align=([\S]+)\])([ \S\t]*?)(\[/align\])",RegexOptions.IgnoreCase);
for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
{
sDetail = sDetail.Replace(m.Groups[0].ToString(),
"
1<p align=" + m.Groups[2].ToString() + ">" +
2m.Groups[3].ToString() + "</p>
");
}
#endregion
#region 处[H=x][/H]标记
//处[H=x][/H]标记
r = new Regex(@"(\[H=([1-6])\])([ \S\t]*?)(\[/H\])",RegexOptions.IgnoreCase);
for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
{
sDetail = sDetail.Replace(m.Groups[0].ToString(),
"
1<h" "="" +="" m.groups[2].tostring()="">" +
2m.Groups[3].ToString() + "</h">
");
}
#endregion
#region 处理[list=x][][/list]
//处理[list=x][][/list]
r = new Regex(@"(\[list(=(A|a|I|i| ))?\]([ \S\t])\r\n)((\[\\]([ \S\t]\r\n))?)(\[/list\])",RegexOptions.IgnoreCase);
for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
{
string strLI = m.Groups[5].ToString();
Regex rLI = new Regex(@"\[\\]([ \S\t]\r\n?)",RegexOptions.IgnoreCase);
Match mLI;
for (mLI = rLI.Match(strLI); mLI.Success; mLI = mLI.NextMatch())
{
strLI = strLI.Replace(mLI.Groups[0].ToString(),"
1<li>" + mLI.Groups[1]);
2}
3sDetail = sDetail.Replace(m.Groups[0].ToString(),
4"<ul "\"="" +="" m.groups[3].tostring()="" type='\""'><b>" + m.Groups[4].ToString() + "</b>" +
5strLI + "</ul>");
6}
7
8#endregion
9#region 处[SHADOW=x][/SHADOW]标记
10//处[SHADOW=x][/SHADOW]标记
11r = new Regex(@"(\\[SHADOW=)(\d*?),(#*\w*?),(\d*?)\\]([\S\t]*?)(\\[\/SHADOW\\])",RegexOptions.IgnoreCase);
12for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
13{
14sDetail = sDetail.Replace(m.Groups[0].ToString(),
15"<table ",="" )="" +="" m.groups[3].tostring()="" strength=" + m.Groups[4].ToString() + " style='FILTER:SHADOW(COLOR="' width=" + m.Groups[2].ToString() + ">" +
16m.Groups[5].ToString() + "</table>");
17}
18#endregion
19#region 处[glow=x][/glow]标记
20//处[glow=x][/glow]标记
21r = new Regex(@"(\\[glow=)(\d*?),(#*\w*?),(\d*?)\\]([\S\t]*?)(\\[\/glow\\])",RegexOptions.IgnoreCase);
22for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
23{
24sDetail = sDetail.Replace(m.Groups[0].ToString(),
25"<table ",="" )="" +="" m.groups[3].tostring()="" strength=" + m.Groups[4].ToString() + " style='FILTER:GLOW(COLOR="' width=" + m.Groups[2].ToString() + ">" +
26m.Groups[5].ToString() + "</table>");
27}
28#endregion
29#region 处[center][/center]标记
30r = new Regex(@"(\\[center\\])([ \S\t]*?)(\\[\/center\\])",RegexOptions.IgnoreCase);
31for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
32{
33sDetail = sDetail.Replace(m.Groups[0].ToString(),"<center>" + m.Groups[2].ToString() + "</center>");
34}
35#endregion
36#region 处[IMG][/IMG]标记
37r = new Regex(@"(\\[IMG\\])(http|https|ftp):\/\/([ \S\t]*?)(\\[\/IMG\\])",RegexOptions.IgnoreCase);
38for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
39{
40sDetail = sDetail.Replace(m.Groups[0].ToString(),"<br/><a "="" +="" :="" href=" + m.Groups[2].ToString() + " m.groups[3].tostring()="" onfocus="this.blur()" target="_blank"><img "="" +="" :="" alt="按此在新窗口浏览图片" border="0" m.groups[3].tostring()="" onload="javascript:if(screen.width-333<this.width)this.width=screen.width-333" src=" + m.Groups[2].ToString() + "/></a>");
41}
42#endregion
43#region 处[em]标记
44r = new Regex(@"(\\[em([\S\t]*?)\\])",RegexOptions.IgnoreCase);
45for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
46{
47sDetail = sDetail.Replace(m.Groups[0].ToString(),"<img ".gif="" +="" align="middle" border="0" m.groups[2].tostring()="" src='pic/em"'/>");
48}
49#endregion
50#region 处[flash=x][/flash]标记
51//处[mp=x][/mp]标记
52r = new Regex(@"(\\[flash=)(\d*?),(\d*?)\\]([\S\t]*?)(\\[\/flash\\])",RegexOptions.IgnoreCase);
53for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
54{
55sDetail = sDetail.Replace(m.Groups[0].ToString(),
56"<a href=" + m.Groups[4].ToString() + " target="_blank"><img alt="点击开新窗口欣赏该FLASH动画!" border="0" src="pic/swf.gif"/> [全屏欣赏]</a><br/><br/><object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" height=" + m.Groups[3].ToString() + " width=" + m.Groups[2].ToString() + "><param name="movie" value=" + m.Groups[4].ToString() + "/><param name="quality" value="high"/><param name="menu" value="false"/><embed height=" + m.Groups[3].ToString() + " menu="false" pluginspage="http://www.macromedia.com/go/getflashplayer" quality="high" src=" + m.Groups[4].ToString() + " type="application/x-shockwave-flash" width=" + m.Groups[2].ToString() + "/>" + m.Groups[4].ToString() + "</object>");
57}
58#endregion
59#region 处[dir=x][/dir]标记
60//处[dir=x][/dir]标记
61r = new Regex(@"(\\[dir=)(\d*?),(\d*?)\\]([\S\t]*?)(\\[\/dir\\])",RegexOptions.IgnoreCase);
62for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
63{
64sDetail = sDetail.Replace(m.Groups[0].ToString(),
65"<object classid="clsid:166B1BCA-3F9C-11CF-8075-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=7,0,2,0" height=" + m.Groups[3].ToString() + " width=" + m.Groups[2].ToString() + "><param name="src" value=" + m.Groups[4].ToString() + "/><embed height=" + m.Groups[3].ToString() + " pluginspage="http://www.macromedia.com/shockwave/download/" src=" + m.Groups[4].ToString() + " width=" + m.Groups[2].ToString() + "/></object>");
66}
67#endregion
68#region 处[rm=x][/rm]标记
69//处[rm=x][/rm]标记
70r = new Regex(@"(\\[rm=)(\d*?),(\d*?)\\]([\S\t]*?)(\\[\/rm\\])",RegexOptions.IgnoreCase);
71for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
72{
73sDetail = sDetail.Replace(m.Groups[0].ToString(),
74"<object class="OBJECT" classid="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA" height=" + m.Groups[3].ToString() + " id="RAOCX" width=" + m.Groups[2].ToString() + "><param name="SRC" value=" + m.Groups[4].ToString() + "/><param name="CONSOLE" value="Clip1"/><param name="CONTROLS" value="imagewindow"/><param name="AUTOSTART" value="true"/></object><br/><object classid="CLSID:CFCDAA03-8BE4-11CF-B84B-0020AFBBCCFA" height="32" id="video2" width=" + m.Groups[2].ToString() + "><param name="SRC" value=" + m.Groups[4].ToString() + "/><param name="AUTOSTART" value="-1"/><param name="CONTROLS" value="controlpanel"/><param name="CONSOLE" value="Clip1"/></object>");
75}
76#endregion
77#region 处[mp=x][/mp]标记
78//处[mp=x][/mp]标记
79r = new Regex(@"(\\[mp=)(\d*?),(\d*?)\\]([\S\t]*?)(\\[\/mp\\])",RegexOptions.IgnoreCase);
80for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
81{
82sDetail = sDetail.Replace(m.Groups[0].ToString(),
83"<object align="middle" class="OBJECT" classid="CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95" height=" + m.Groups[3].ToString() + " id="MediaPlayer" width=" + m.Groups[2].ToString() + "><param name="ShowStatusBar" value="-1"/><param name="Filename" value=" + m.Groups[4].ToString() + "/><embed codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701" flename="mp" height=" + m.Groups[3].ToString() + " src=" + m.Groups[4].ToString() + " type="application/x-oleobject" width=" + m.Groups[2].ToString() + "/></object>");
84}
85#endregion
86#region 处[qt=x][/qt]标记
87//处[qt=x][/qt]标记
88r = new Regex(@"(\\[qt=)(\d*?),(\d*?)\\]([\S\t]*?)(\\[\/qt\\])",RegexOptions.IgnoreCase);
89for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
90{
91sDetail = sDetail.Replace(m.Groups[0].ToString(),
92"<embed autoplay="true" bgcolor="#000000" cache="false" controller="true" height=" + m.Groups[3].ToString() + " kioskmode="false" loop="false" playeveryframe="false" pluginspage="http://www.apple.com/quicktime/" scale="TOFIT" src=" + m.Groups[4].ToString() + " targetcache="false" width=" + m.Groups[2].ToString() + "/>");
93}
94#endregion
95#region 处[QUOTE][/QUOTE]标记
96r = new Regex(@"(\\[QUOTE\\])([ \S\t]*?)(\\[\/QUOTE\\])",RegexOptions.IgnoreCase);
97for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
98{
99sDetail = sDetail.Replace(m.Groups[0].ToString(),"<table 9pt="" align="center" bgcolor="#F2F8FF" border="1" bordercolor="#000000" cellpadding="0" cellspacing="0" style="FONT-SIZE:" width="94%"><tr><td><table border="0" cellpadding="5" cellspacing="1" width="100%"><tr><td>" + m.Groups[2].ToString() + "</td></tr></table></td></tr></table><br/>");
100}
101#endregion
102#region 处[move][/move]标记
103r = new Regex(@"(\\[move\\])([ \S\t]*?)(\\[\/move\\])",RegexOptions.IgnoreCase);
104for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
105{
106sDetail = sDetail.Replace(m.Groups[0].ToString(),"<marquee scrollamount="3">" + m.Groups[2].ToString() + "</marquee>");
107}
108#endregion
109#region 处[FLY][/FLY]标记
110r = new Regex(@"(\\[FLY\\])([ \S\t]*?)(\\[\/FLY\\])",RegexOptions.IgnoreCase);
111for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
112{
113sDetail = sDetail.Replace(m.Groups[0].ToString(),"<marquee behavior="alternate" scrollamount="3" width="80%">" + m.Groups[2].ToString() + "</marquee>");
114}
115#endregion
116#region 处[image][/image]标记
117//处[image][/image]标记
118r = new Regex(@"(\\[image\\])([ \S\t]*?)(\\[\/image\\])",RegexOptions.IgnoreCase);
119for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
120{
121sDetail = sDetail.Replace(m.Groups[0].ToString(),
122"<img "\"="" +="" align="middle" border="0" m.groups[2].tostring()="" src='\""'/><br/>");
123}
124#endregion
125
126return sDetail;
127}
128#endregion
129}
130}</li>