C# UBB解析类

UBB
  1 using System;
  2 using System.Text;
  3 using System.Text.RegularExpressions;
  4 
  5 namespace CommonMethod
  6 {
  7     /**/
  8     /// <summary>
  9     /// UBBHelper 的摘要说明。
 10     /// </summary>
 11     public class UBBHelper
 12     {
 13         public UBBHelper()
 14         {
 15             //
 16             // TODO: 在此处添加构造函数逻辑
 17             //
 18         }
 19 
 20         #region 公共静态方法
 21         /**/
 22         /// <summary>
 23         /// UBBHelper代码处理函数
 24         /// </summary>
 25         /// <param name="sDetail">输入字符串</param>
 26         /// <returns>输出字符串</returns>
 27         public string UBBToHTML(string sDetail)
 28         {
 29             Regex r;
 30             Match m;
 31             #region 处理空格
 32             sDetail = sDetail.Replace(" ""&nbsp;");
 33             #endregion
 34             #region 处理单引号
 35             sDetail = sDetail.Replace("'""");
 36             #endregion
 37             #region 处理双引号
 38             sDetail = sDetail.Replace("\"""&quot;");
 39             #endregion
 40             #region 处理html标记符
 41             sDetail = sDetail.Replace("<""&lt;");
 42             sDetail = sDetail.Replace(">""&gt;");
 43 
 44           #endregion
 45             #region 处理换行
 46             //处理换行,在每个新行的前面添加两个全角空格
 47             r = new Regex(@"(\r\n((&nbsp;)| )+)(?<正文>\S+)", RegexOptions.IgnoreCase);
 48             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
 49             {
 50                 sDetail = sDetail.Replace(m.Groups[0].ToString(), "<BR>  " + m.Groups["正文"].ToString());
 51             }
 52             //处理换行,在每个新行的前面添加两个全角空格
 53             sDetail = sDetail.Replace("\r\n""<BR>");
 54             #endregion
 55             #region 处理[b][/b]标记
 56             r = new Regex(@"(\[b\])([ \S\t]*?)(\[\/b\])", RegexOptions.IgnoreCase);
 57             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
 58             {
 59                 sDetail = sDetail.Replace(m.Groups[0].ToString(), "<B>" + m.Groups[2].ToString() + "</B>");
 60             }
 61            #endregion
 62             #region 处理[i][/i]标记
 63             r = new Regex(@"(\[i\])([ \S\t]*?)(\[\/i\])", RegexOptions.IgnoreCase);
 64             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
 65             {
 66                 sDetail = sDetail.Replace(m.Groups[0].ToString(), "<I>" + m.Groups[2].ToString() + "</I>");
 67             }
 68            #endregion
 69             #region 处理[u][/u]标记
 70             r = new Regex(@"(\[U\])([ \S\t]*?)(\[\/U\])", RegexOptions.IgnoreCase);
 71             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
 72             {
 73                 sDetail = sDetail.Replace(m.Groups[0].ToString(), "<U>" + m.Groups[2].ToString() + "</U>");
 74             }
 75             #endregion
 76             #region 处理[p][/p]标记
 77             //处理[p][/p]标记
 78             r = new Regex(@"((\r\n)*\[p\])(.*?)((\r\n)*\[\/p\])", RegexOptions.IgnoreCase | RegexOptions.Singleline);
 79             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
 80             {
 81                 sDetail = sDetail.Replace(m.Groups[0].ToString(), "<P class=\"pstyle\">" + m.Groups[3].ToString() + "</P>");
 82             }
 83            #endregion
 84             #region 处理[sup][/sup]标记
 85             //处理[sup][/sup]标记
 86             r = new Regex(@"(\[sup\])([ \S\t]*?)(\[\/sup\])", RegexOptions.IgnoreCase);
 87             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
 88             {
 89                 sDetail = sDetail.Replace(m.Groups[0].ToString(), "<SUP>" + m.Groups[2].ToString() + "</SUP>");
 90             }
 91             #endregion
 92             #region 处理[sub][/sub]标记
 93             //处理[sub][/sub]标记
 94             r = new Regex(@"(\[sub\])([ \S\t]*?)(\[\/sub\])", RegexOptions.IgnoreCase);
 95             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
 96             {
 97                 sDetail = sDetail.Replace(m.Groups[0].ToString(), "<SUB>" + m.Groups[2].ToString() + "</SUB>");
 98             }
 99             #endregion
100             #region 处理标记
101             //处理标记
102             r = new Regex(@"(\[url\])([ \S\t]*?)(\[\/url\])", RegexOptions.IgnoreCase);
103             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
104             {
105                 sDetail = sDetail.Replace(m.Groups[0].ToString(),
106                  "<A href=\"" + m.Groups[2].ToString() + "\" target=\"_blank\">"
107             + m.Groups[2].ToString() + "</A>");
108             }
109            #endregion
110             #region 处理[url=xxx][/url]标记
111             //处理[url=xxx][/url]标记
112             r = new Regex(@"(\[url=([ \S\t]+)\])([ \S\t]*?)(\[\/url\])", RegexOptions.IgnoreCase);
113             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
114             {
115                 sDetail = sDetail.Replace(m.Groups[0].ToString(),
116                  "<A href=\"" + m.Groups[2].ToString() + "\" target=\"_blank\">"
117             + m.Groups[3].ToString() + "</A>");
118             }
119             #endregion
120             #region 处理[email][/email]标记
121             //处理[email][/email]标记
122             r = new Regex(@"(\[email\])([ \S\t]*?)(\[\/email\])", RegexOptions.IgnoreCase);
123             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
124             {
125                 sDetail = sDetail.Replace(m.Groups[0].ToString(),
126                  "<A href=\"mailto:" + m.Groups[2].ToString() + "\" target=\"_blank\">" +
127                  m.Groups[2].ToString() + "</A>");
128             }
129             #endregion
130             #region 处理[email=xxx][/email]标记
131             //处理[email=xxx][/email]标记
132             r = new Regex(@"(\[email=([ \S\t]+)\])([ \S\t]*?)(\[\/email\])", RegexOptions.IgnoreCase);
133             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
134             {
135                 sDetail = sDetail.Replace(m.Groups[0].ToString(),
136                  "<A href=\"mailto:" + m.Groups[2].ToString() + "\" target=\"_blank\">" +
137                  m.Groups[3].ToString() + "</A>");
138             }
139             #endregion
140             #region 处理[size=x][/size]标记
141             //处理[size=x][/size]标记
142             r = new Regex(@"(\[size=([1-7])\])([ \S\t]*?)(\[\/size\])", RegexOptions.IgnoreCase);
143             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
144             {
145                 sDetail = sDetail.Replace(m.Groups[0].ToString(),
146                  "<FONT SIZE=" + m.Groups[2].ToString() + ">" +
147                  m.Groups[3].ToString() + "</FONT>");
148             }
149             #endregion
150             #region 处理[color=x][/color]标记
151             //处理[color=x][/color]标记
152             r = new Regex(@"(\[color=([\S]+)\])([ \S\t]*?)(\[\/color\])", RegexOptions.IgnoreCase);
153             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
154             {
155                 sDetail = sDetail.Replace(m.Groups[0].ToString(),
156                  "<FONT COLOR=" + m.Groups[2].ToString() + ">" +
157                  m.Groups[3].ToString() + "</FONT>");
158             }
159             #endregion
160             #region 处理[font=x][/font]标记
161             //处理[font=x][/font]标记
162             r = new Regex(@"(\[font=([\S]+)\])([ \S\t]*?)(\[\/font\])", RegexOptions.IgnoreCase);
163             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
164             {
165                 sDetail = sDetail.Replace(m.Groups[0].ToString(),
166                  "<FONT FACE=" + m.Groups[2].ToString() + ">" +
167                  m.Groups[3].ToString() + "</FONT>");
168             }
169             #endregion
170             #region 处理图片链接
171             //处理图片链接
172             r = new Regex("\\[picture\\](\\d+?)\\[\\/picture\\]", RegexOptions.IgnoreCase);
173             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
174             {
175                 sDetail = sDetail.Replace(m.Groups[0].ToString(),
176                  "<A href=\"ShowImage.aspx?Type=ALL&Action=forumImage&ImageID="
177             + m.Groups[1].ToString() +
178                  "\" target=\"_blank\"><IMG border=0 Title=\"点击打开新窗口查看\" src=\"ShowImage.aspx?Action=forumImage&ImageID=" + m.Groups[1].ToString() +
179                  "\"></A>");
180             }
181             #endregion
182             #region 处理[align=x][/align]
183             //处理[align=x][/align]
184             r = new Regex(@"(\[align=([\S]+)\])([ \S\t]*?)(\[\/align\])", RegexOptions.IgnoreCase);
185             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
186             {
187                 sDetail = sDetail.Replace(m.Groups[0].ToString(),
188                  "<P align=" + m.Groups[2].ToString() + ">" +
189                  m.Groups[3].ToString() + "</P>");
190             }
191             #endregion
192             #region 处理[H=x][/H]标记
193             //处理[H=x][/H]标记
194             r = new Regex(@"(\[H=([1-6])\])([ \S\t]*?)(\[\/H\])", RegexOptions.IgnoreCase);
195             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
196             {
197                 sDetail = sDetail.Replace(m.Groups[0].ToString(),
198                  "<H" + m.Groups[2].ToString() + ">" +
199                  m.Groups[3].ToString() + "</H" + m.Groups[2].ToString() + ">");
200             }
201             #endregion
202             #region 处理[list=x][*][/list]
203             //处理[list=x][*][/list]
204             r = new Regex(@"(\[list(=(A|a|I|i| ))?\]([ \S\t]*)\r\n)((\[\*\]([ \S\t]*\r\n))*?)(\[\/list\])", RegexOptions.IgnoreCase);
205             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
206             {
207                 string strLI = m.Groups[5].ToString();
208                 Regex rLI = new Regex(@"\[\*\]([ \S\t]*\r\n?)", RegexOptions.IgnoreCase);
209                 Match mLI;
210                 for (mLI = rLI.Match(strLI); mLI.Success; mLI = mLI.NextMatch())
211                 {
212                     strLI = strLI.Replace(mLI.Groups[0].ToString(), "<LI>" + mLI.Groups[1]);
213                 }
214                 sDetail = sDetail.Replace(m.Groups[0].ToString(),
215                  "<UL TYPE=\"" + m.Groups[3].ToString() + "\"><B>" + m.Groups[4].ToString() + "</B>" +
216                  strLI + "</UL>");
217             }
218 
219            #endregion
220             #region 处理[SHADOW=x][/SHADOW]标记
221             //处理[SHADOW=x][/SHADOW]标记
222             r = new Regex(@"(\[SHADOW=)(\d*?),(#*\w*?),(\d*?)\]([\S\t]*?)(\[\/SHADOW\])", RegexOptions.IgnoreCase);
223             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
224             {
225                 sDetail = sDetail.Replace(m.Groups[0].ToString(),
226                  "<TABLE WIDTH=" + m.Groups[2].ToString() + "  STYLE=FILTER:SHADOW(COLOR=" + m.Groups[3].ToString() + ", STRENGTH=" + m.Groups[4].ToString() + ")>" +
227                  m.Groups[5].ToString() + "</TABLE>");
228             }
229             #endregion
230             #region 处理[glow=x][/glow]标记
231             //处理[glow=x][/glow]标记
232             r = new Regex(@"(\[glow=)(\d*?),(#*\w*?),(\d*?)\]([\S\t]*?)(\[\/glow\])", RegexOptions.IgnoreCase);
233             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
234             {
235                 sDetail = sDetail.Replace(m.Groups[0].ToString(),
236                  "<TABLE WIDTH=" + m.Groups[2].ToString() + "  STYLE=FILTER:GLOW(COLOR=" + m.Groups[3].ToString() + ", STRENGTH=" + m.Groups[4].ToString() + ")>" +
237                  m.Groups[5].ToString() + "</TABLE>");
238             }
239             #endregion
240             #region 处理[center][/center]标记
241             r = new Regex(@"(\[center\])([ \S\t]*?)(\[\/center\])", RegexOptions.IgnoreCase);
242             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
243             {
244                 sDetail = sDetail.Replace(m.Groups[0].ToString(), "<CENTER>" + m.Groups[2].ToString() + "</CENTER>");
245             }
246            #endregion
247             #region 处理标记
248             r = new Regex(@"(\[IMG\])(http|https|ftp):\/\/([ \S\t]*?)(\[\/IMG\])", RegexOptions.IgnoreCase);
249             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
250             {
251                 sDetail = sDetail.Replace(m.Groups[0].ToString(), "<br><a onfocus=this.blur() href=" + m.Groups[2].ToString() + "://" + m.Groups[3].ToString() + " target=_blank><IMG SRC=" + m.Groups[2].ToString() + "://" + m.Groups[3].ToString() + " border=0 alt=按此在新窗口浏览图片 onload=javascript:if(screen.width-333<this.width)this.width=screen.width-333></a>");
252             }
253             #endregion
254             #region 处理[em]标记
255             r = new Regex(@"(\[em([\S\t]*?)\])", RegexOptions.IgnoreCase);
256             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
257             {
258                 sDetail = sDetail.Replace(m.Groups[0].ToString(), "<img src=pic/em" + m.Groups[2].ToString() + ".gif border=0 align=middle>");
259             }
260            #endregion
261             #region 处理[flash=x][/flash]标记
262             //处理[mp=x][/mp]标记
263             r = new Regex(@"(\[flash=)(\d*?),(\d*?)\]([\S\t]*?)(\[\/flash\])", RegexOptions.IgnoreCase);
264             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
265             {
266                 sDetail = sDetail.Replace(m.Groups[0].ToString(),
267                  "<a href=" + m.Groups[4].ToString() + " TARGET=_blank><IMG SRC=pic/swf.gif border=0 alt=点击开新窗口欣赏该FLASH动画!> [全屏欣赏]</a><br><br><OBJECT codeBase=http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0 classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000 width=" + m.Groups[2].ToString() + " height=" + m.Groups[3].ToString() + "><PARAM NAME=movie VALUE=" + m.Groups[4].ToString() + "><PARAM NAME=quality VALUE=high><param name=menu value=false><embed src=" + m.Groups[4].ToString() + " quality=high menu=false pluginspage=http://www.macromedia.com/go/getflashplayer type=application/x-shockwave-flash width=" + m.Groups[2].ToString() + " height=" + m.Groups[3].ToString() + ">" + m.Groups[4].ToString() + "</embed></OBJECT>");
268             }
269             #endregion
270             #region 处理[dir=x][/dir]标记
271             //处理[dir=x][/dir]标记
272             r = new Regex(@"(\[dir=)(\d*?),(\d*?)\]([\S\t]*?)(\[\/dir\])", RegexOptions.IgnoreCase);
273             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
274             {
275                 sDetail = sDetail.Replace(m.Groups[0].ToString(),
276                  "<object classid=clsid:166B1BCA-3F9C-11CF-8075-444553540000 codebase=http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=7,0,2,0 width=" + m.Groups[2].ToString() + " height=" + m.Groups[3].ToString() + "><param name=src value=" + m.Groups[4].ToString() + "><embed src=" + m.Groups[4].ToString() + " pluginspage=http://www.macromedia.com/shockwave/download/ width=" + m.Groups[2].ToString() + " height=" + m.Groups[3].ToString() + "></embed></object>");
277             }
278             #endregion
279             #region 处理[rm=x][/rm]标记
280             //处理[rm=x][/rm]标记
281             r = new Regex(@"(\[rm=)(\d*?),(\d*?)\]([\S\t]*?)(\[\/rm\])", RegexOptions.IgnoreCase);
282             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
283             {
284                 sDetail = sDetail.Replace(m.Groups[0].ToString(),
285                  "<OBJECT classid=clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA class=OBJECT id=RAOCX width=" + m.Groups[2].ToString() + " height=" + m.Groups[3].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>");
286             }
287             #endregion
288             #region 处理[mp=x][/mp]标记
289             //处理[mp=x][/mp]标记
290             r = new Regex(@"(\[mp=)(\d*?),(\d*?)\]([\S\t]*?)(\[\/mp\])", RegexOptions.IgnoreCase);
291             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
292             {
293                 sDetail = sDetail.Replace(m.Groups[0].ToString(),
294                  "<object align=middle classid=CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95 class=OBJECT id=MediaPlayer width=" + m.Groups[2].ToString() + " height=" + m.Groups[3].ToString() + " ><param name=ShowStatusBar value=-1><param name=Filename value=" + m.Groups[4].ToString() + "><embed type=application/x-oleobject codebase=http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701 flename=mp src=" + m.Groups[4].ToString() + "  width=" + m.Groups[2].ToString() + " height=" + m.Groups[3].ToString() + "></embed></object>");
295             }
296             #endregion
297             #region 处理[qt=x][/qt]标记
298             //处理[qt=x][/qt]标记
299             r = new Regex(@"(\[qt=)(\d*?),(\d*?)\]([\S\t]*?)(\[\/qt\])", RegexOptions.IgnoreCase);
300             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
301             {
302                 sDetail = sDetail.Replace(m.Groups[0].ToString(),
303                  "<embed src=" + m.Groups[4].ToString() + " width=" + m.Groups[2].ToString() + " height=" + m.Groups[3].ToString() + " autoplay=true loop=false controller=true playeveryframe=false cache=false scale=TOFIT bgcolor=#000000 kioskmode=false targetcache=false pluginspage=http://www.apple.com/quicktime/>");
304             }
305             #endregion
306             #region 处理[QUOTE][/QUOTE]标记
307             r = new Regex(@"(\[QUOTE\])([ \S\t]*?)(\[\/QUOTE\])", RegexOptions.IgnoreCase);
308             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
309             {
310                 sDetail = sDetail.Replace(m.Groups[0].ToString(), "<table cellpadding=0 cellspacing=0 border=1 WIDTH=94% bordercolor=#000000 bgcolor=#F2F8FF align=center  style=FONT-SIZE: 9pt><tr><td  ><table width=100% cellpadding=5 cellspacing=1 border=0><TR><TD >" + m.Groups[2].ToString() + "</table></table><br>");
311             }
312             #endregion
313             #region 处理[move][/move]标记
314             r = new Regex(@"(\[move\])([ \S\t]*?)(\[\/move\])", RegexOptions.IgnoreCase);
315             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
316             {
317                 sDetail = sDetail.Replace(m.Groups[0].ToString(), "<MARQUEE scrollamount=3>" + m.Groups[2].ToString() + "</MARQUEE>");
318             }
319             #endregion
320             #region 处理[FLY][/FLY]标记
321             r = new Regex(@"(\[FLY\])([ \S\t]*?)(\[\/FLY\])", RegexOptions.IgnoreCase);
322             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
323             {
324                 sDetail = sDetail.Replace(m.Groups[0].ToString(), "<MARQUEE width=80% behavior=alternate scrollamount=3>" + m.Groups[2].ToString() + "</MARQUEE>");
325             }
326             #endregion
327             #region 处理[image][/image]标记
328             //处理[image][/image]标记
329             r = new Regex(@"(\[image\])([ \S\t]*?)(\[\/image\])", RegexOptions.IgnoreCase);
330             for (m = r.Match(sDetail); m.Success; m = m.NextMatch())
331             {
332                 sDetail = sDetail.Replace(m.Groups[0].ToString(),
333                  "<img src=\"" + m.Groups[2].ToString() + "\" border=0 align=middle><br>");
334             }
335             #endregion
336 
337             return sDetail;
338         }
339         #endregion
340     }
341 }

 

posted @ 2010-05-11 17:45 星际 阅读(120) 评论(0) 编辑 收藏