UBB(c#完整版)(我的小毛驴)(2005年) 选择自 hushiyuhsy 的 Blog

 

最近我又开始用c#做论坛,在网上找了一下,虽然也有关于ubb(c#)的转换代码,可是同样都不全面,我在这里补充了一下,拿出来和大家共享。
有什么问题到我个人的论坛[url=http://www.hushiyu.com]www.hushiyu.com[/url]来交流,随时欢迎。

  1using System;
  2using System.Text;
  3using System.Text.RegularExpressions;
  4
  5namespace myluntan
  6{
  7 /// <summary>
  8 /// UBB 的摘要说明。
  9 /// </summary>

 10 public class UBB
 11 {
 12  public UBB()
 13  {
 14   //
 15   // TODO: 在此处添加构造函数逻辑
 16   //
 17  }

 18    
 19  #region 公共静态方法
 20  /// <summary>
 21  /// UBB代码处理函数
 22  /// </summary>
 23  /// <param name="sDetail">输入字符串</param>
 24  /// <returns>输出字符串</returns>

 25  public string UBBToHTML(string sDetail)
 26  {
 27   Regex r;
 28   Match m;
 29   #region 处理空格
 30   sDetail = sDetail.Replace(" ","&nbsp;");
 31   #endregion

 32   #region 处理单引号
 33   sDetail = sDetail.Replace("'","");
 34   #endregion

 35   #region 处理双引号
 36   sDetail = sDetail.Replace("\"","&quot;");
 37   #endregion

 38   #region html标记符
 39   sDetail = sDetail.Replace("<","&lt;");
 40   sDetail = sDetail.Replace(">","&gt;");
 41   
 42   #endregion

 43   #region 处理换行
 44   //处理换行,在每个新行的前面添加两个全角空格
 45   r = new Regex(@"(\r\n((&nbsp;)| )+)(?<正文>\S+)",RegexOptions.IgnoreCase);
 46   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
 47   {
 48    sDetail = sDetail.Replace(m.Groups[0].ToString(),"<BR>  " + m.Groups["正文"].ToString());
 49   }

 50   //处理换行,在每个新行的前面添加两个全角空格
 51   sDetail = sDetail.Replace("\r\n","<BR>");
 52   #endregion

 53   #region 处[b][/b]标记
 54   r = new Regex(@"(\[b\])([ \S\t]*?)(\[\/b\])",RegexOptions.IgnoreCase);
 55   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
 56   {
 57    sDetail = sDetail.Replace(m.Groups[0].ToString(),"<B>" + m.Groups[2].ToString() + "</B>");
 58   }

 59   #endregion

 60   #region 处[i][/i]标记
 61   r = new Regex(@"(\[i\])([ \S\t]*?)(\[\/i\])",RegexOptions.IgnoreCase);
 62   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
 63   {
 64    sDetail = sDetail.Replace(m.Groups[0].ToString(),"<I>" + m.Groups[2].ToString() + "</I>");
 65   }

 66   #endregion

 67   #region 处[u][/u]标记
 68   r = new Regex(@"(\[U\])([ \S\t]*?)(\[\/U\])",RegexOptions.IgnoreCase);
 69   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
 70   {
 71    sDetail = sDetail.Replace(m.Groups[0].ToString(),"<U>" + m.Groups[2].ToString() + "</U>");
 72   }

 73   #endregion

 74   #region 处[p][/p]标记
 75   //处[p][/p]标记
 76   r = new Regex(@"((\r\n)*\[p\])(.*?)((\r\n)*\[\/p\])",RegexOptions.IgnoreCase|RegexOptions.Singleline);
 77   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
 78   {
 79    sDetail = sDetail.Replace(m.Groups[0].ToString(),"<P class=\"pstyle\">" + m.Groups[3].ToString() + "</P>");
 80   }

 81   #endregion

 82   #region 处[sup][/sup]标记
 83   //处[sup][/sup]标记
 84   r = new Regex(@"(\[sup\])([ \S\t]*?)(\[\/sup\])",RegexOptions.IgnoreCase);
 85   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
 86   {
 87    sDetail = sDetail.Replace(m.Groups[0].ToString(),"<SUP>" + m.Groups[2].ToString() + "</SUP>");
 88   }

 89   #endregion

 90   #region 处[sub][/sub]标记
 91   //处[sub][/sub]标记
 92   r = new Regex(@"(\[sub\])([ \S\t]*?)(\[\/sub\])",RegexOptions.IgnoreCase);
 93   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
 94   {
 95    sDetail = sDetail.Replace(m.Groups[0].ToString(),"<SUB>" + m.Groups[2].ToString() + "</SUB>");
 96   }

 97   #endregion

 98   #region 处[url][/url]标记
 99   //处[url][/url]标记
100   r = new Regex(@"(\[url\])([ \S\t]*?)(\[\/url\])",RegexOptions.IgnoreCase);
101   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
102   {
103    sDetail = sDetail.Replace(m.Groups[0].ToString(),
104     "<A href=\"" + m.Groups[2].ToString() + "\" target=\"_blank\">" +
105     m.Groups[2].ToString() + "</A>");
106   }

107   #endregion

108   #region 处[url=xxx][/url]标记
109   //处[url=xxx][/url]标记
110   r = new Regex(@"(\[url=([ \S\t]+)\])([ \S\t]*?)(\[\/url\])",RegexOptions.IgnoreCase);
111   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
112   {
113    sDetail = sDetail.Replace(m.Groups[0].ToString(),
114     "<A href=\"" + m.Groups[2].ToString() + "\" target=\"_blank\">" +
115     m.Groups[3].ToString() + "</A>");
116   }

117   #endregion

118   #region 处[email][/email]标记
119   //处[email][/email]标记
120   r = new Regex(@"(\[email\])([ \S\t]*?)(\[\/email\])",RegexOptions.IgnoreCase);
121   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
122   {
123    sDetail = sDetail.Replace(m.Groups[0].ToString(),
124     "<A href=\"mailto:" + m.Groups[2].ToString() + "\" target=\"_blank\">" +
125     m.Groups[2].ToString() + "</A>");
126   }

127   #endregion

128   #region 处[email=xxx][/email]标记
129   //处[email=xxx][/email]标记
130   r = new Regex(@"(\[email=([ \S\t]+)\])([ \S\t]*?)(\[\/email\])",RegexOptions.IgnoreCase);
131   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
132   {
133    sDetail = sDetail.Replace(m.Groups[0].ToString(),
134     "<A href=\"mailto:" + m.Groups[2].ToString() + "\" target=\"_blank\">" +
135     m.Groups[3].ToString() + "</A>");
136   }

137   #endregion

138   #region 处[size=x][/size]标记
139   //处[size=x][/size]标记
140   r = new Regex(@"(\[size=([1-7])\])([ \S\t]*?)(\[\/size\])",RegexOptions.IgnoreCase);
141   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
142   {
143    sDetail = sDetail.Replace(m.Groups[0].ToString(),
144     "<FONT SIZE=" + m.Groups[2].ToString() + ">" + 
145     m.Groups[3].ToString() + "</FONT>");
146   }

147   #endregion

148   #region 处[color=x][/color]标记
149   //处[color=x][/color]标记
150   r = new Regex(@"(\[color=([\S]+)\])([ \S\t]*?)(\[\/color\])",RegexOptions.IgnoreCase);
151   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
152   {
153    sDetail = sDetail.Replace(m.Groups[0].ToString(),
154     "<FONT COLOR=" + m.Groups[2].ToString() + ">" + 
155     m.Groups[3].ToString() + "</FONT>");
156   }

157   #endregion

158   #region 处[font=x][/font]标记
159   //处[font=x][/font]标记
160   r = new Regex(@"(\[font=([\S]+)\])([ \S\t]*?)(\[\/font\])",RegexOptions.IgnoreCase);
161   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
162   {
163    sDetail = sDetail.Replace(m.Groups[0].ToString(),
164     "<FONT FACE=" + m.Groups[2].ToString() + ">" + 
165     m.Groups[3].ToString() + "</FONT>");
166   }

167   #endregion

168   #region 处理图片链接
169   //处理图片链接
170   r = new Regex("\\[picture\\](\\d+?)\\[\\/picture\\]",RegexOptions.IgnoreCase);
171   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
172   {
173    sDetail = sDetail.Replace(m.Groups[0].ToString(),
174     "<A href=\"ShowImage.aspx?Type=ALL&Action=forumImage&ImageID=" + m.Groups[1].ToString() +
175     "\" target=\"_blank\"><IMG border=0 Title=\"点击打开新窗口查看\" src=\"ShowImage.aspx?Action=forumImage&ImageID=" + m.Groups[1].ToString() +
176     "\"></A>");
177   }

178   #endregion

179   #region 处理[align=x][/align]
180   //处理[align=x][/align]
181   r = new Regex(@"(\[align=([\S]+)\])([ \S\t]*?)(\[\/align\])",RegexOptions.IgnoreCase);
182   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
183   {
184    sDetail = sDetail.Replace(m.Groups[0].ToString(),
185     "<P align=" + m.Groups[2].ToString() + ">" + 
186     m.Groups[3].ToString() + "</P>");
187   }

188   #endregion

189   #region 处[H=x][/H]标记
190   //处[H=x][/H]标记
191   r = new Regex(@"(\[H=([1-6])\])([ \S\t]*?)(\[\/H\])",RegexOptions.IgnoreCase);
192   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
193   {
194    sDetail = sDetail.Replace(m.Groups[0].ToString(),
195     "<H" + m.Groups[2].ToString() + ">" + 
196     m.Groups[3].ToString() + "</H" + m.Groups[2].ToString() + ">");
197   }

198   #endregion

199   #region 处理[list=x][*][/list]
200   //处理[list=x][*][/list]
201   r = new Regex(@"(\[list(=(A|a|I|i| ))?\]([ \S\t]*)\r\n)((\[\*\]([ \S\t]*\r\n))*?)(\[\/list\])",RegexOptions.IgnoreCase);
202   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
203   {
204    string strLI = m.Groups[5].ToString();
205    Regex rLI = new Regex(@"\[\*\]([ \S\t]*\r\n?)",RegexOptions.IgnoreCase);
206    Match mLI;
207    for (mLI = rLI.Match(strLI); mLI.Success; mLI = mLI.NextMatch()) 
208    {
209     strLI = strLI.Replace(mLI.Groups[0].ToString(),"<LI>" + mLI.Groups[1]);
210    }

211    sDetail = sDetail.Replace(m.Groups[0].ToString(),
212     "<UL TYPE=\"" + m.Groups[3].ToString() + "\"><B>" + m.Groups[4].ToString() + "</B>" + 
213     strLI + "</UL>");
214   }

215
216   #endregion

217   #region 处[SHADOW=x][/SHADOW]标记
218   //处[SHADOW=x][/SHADOW]标记
219   r = new Regex(@"(\[SHADOW=)(\d*?),(#*\w*?),(\d*?)\]([\S\t]*?)(\[\/SHADOW\])",RegexOptions.IgnoreCase);
220   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
221   {
222    sDetail = sDetail.Replace(m.Groups[0].ToString(),
223     "<TABLE WIDTH=" + m.Groups[2].ToString() + "  STYLE=FILTER:SHADOW(COLOR=" + m.Groups[3].ToString() + ", STRENGTH=" + m.Groups[4].ToString() + ")>" + 
224     m.Groups[5].ToString() + "</TABLE>");
225   }

226   #endregion

227   #region 处[glow=x][/glow]标记
228   //处[glow=x][/glow]标记
229   r = new Regex(@"(\[glow=)(\d*?),(#*\w*?),(\d*?)\]([\S\t]*?)(\[\/glow\])",RegexOptions.IgnoreCase);
230   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
231   {
232    sDetail = sDetail.Replace(m.Groups[0].ToString(),
233     "<TABLE WIDTH=" + m.Groups[2].ToString() + "  STYLE=FILTER:GLOW(COLOR=" + m.Groups[3].ToString() + ", STRENGTH=" + m.Groups[4].ToString() + ")>" + 
234     m.Groups[5].ToString() + "</TABLE>");
235   }

236   #endregion

237   #region 处[center][/center]标记
238   r = new Regex(@"(\[center\])([ \S\t]*?)(\[\/center\])",RegexOptions.IgnoreCase);
239   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
240   {
241    sDetail = sDetail.Replace(m.Groups[0].ToString(),"<CENTER>" + m.Groups[2].ToString() + "</CENTER>");
242   }

243   #endregion

244   #region 处[IMG][/IMG]标记
245   r = new Regex(@"(\[IMG\])(http|https|ftp):\/\/([ \S\t]*?)(\[\/IMG\])",RegexOptions.IgnoreCase);
246   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
247   {
248    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>");
249   }

250   #endregion

251   #region 处[em]标记
252   r = new Regex(@"(\[em([\S\t]*?)\])",RegexOptions.IgnoreCase);
253   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
254   {
255    sDetail = sDetail.Replace(m.Groups[0].ToString(),"<img src=pic/em" + m.Groups[2].ToString() + ".gif border=0 align=middle>");
256   }

257   #endregion

258   #region 处[flash=x][/flash]标记
259   //处[mp=x][/mp]标记
260   r = new Regex(@"(\[flash=)(\d*?),(\d*?)\]([\S\t]*?)(\[\/flash\])",RegexOptions.IgnoreCase);
261   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
262   {
263    sDetail = sDetail.Replace(m.Groups[0].ToString(),
264     "<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>");
265   }

266   #endregion

267   #region 处[dir=x][/dir]标记
268   //处[dir=x][/dir]标记
269   r = new Regex(@"(\[dir=)(\d*?),(\d*?)\]([\S\t]*?)(\[\/dir\])",RegexOptions.IgnoreCase);
270   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
271   {
272    sDetail = sDetail.Replace(m.Groups[0].ToString(),
273     "<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>");
274   }

275   #endregion

276   #region 处[rm=x][/rm]标记
277   //处[rm=x][/rm]标记
278   r = new Regex(@"(\[rm=)(\d*?),(\d*?)\]([\S\t]*?)(\[\/rm\])",RegexOptions.IgnoreCase);
279   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
280   {
281    sDetail = sDetail.Replace(m.Groups[0].ToString(),
282     "<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>");
283   }

284   #endregion

285   #region 处[mp=x][/mp]标记
286   //处[mp=x][/mp]标记
287   r = new Regex(@"(\[mp=)(\d*?),(\d*?)\]([\S\t]*?)(\[\/mp\])",RegexOptions.IgnoreCase);
288   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
289   {
290    sDetail = sDetail.Replace(m.Groups[0].ToString(),
291     "<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>");
292   }

293   #endregion

294   #region 处[qt=x][/qt]标记
295   //处[qt=x][/qt]标记
296   r = new Regex(@"(\[qt=)(\d*?),(\d*?)\]([\S\t]*?)(\[\/qt\])",RegexOptions.IgnoreCase);
297   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
298   {
299    sDetail = sDetail.Replace(m.Groups[0].ToString(),
300     "<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/>");
301   }

302   #endregion

303   #region 处[QUOTE][/QUOTE]标记
304   r = new Regex(@"(\[QUOTE\])([ \S\t]*?)(\[\/QUOTE\])",RegexOptions.IgnoreCase);
305   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
306   {
307    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>");
308   }

309   #endregion

310   #region 处[move][/move]标记
311   r = new Regex(@"(\[move\])([ \S\t]*?)(\[\/move\])",RegexOptions.IgnoreCase);
312   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
313   {
314    sDetail = sDetail.Replace(m.Groups[0].ToString(),"<MARQUEE scrollamount=3>" + m.Groups[2].ToString() + "</MARQUEE>");
315   }

316   #endregion

317   #region 处[FLY][/FLY]标记
318   r = new Regex(@"(\[FLY\])([ \S\t]*?)(\[\/FLY\])",RegexOptions.IgnoreCase);
319   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
320   {
321    sDetail = sDetail.Replace(m.Groups[0].ToString(),"<MARQUEE width=80% behavior=alternate scrollamount=3>" + m.Groups[2].ToString() + "</MARQUEE>");
322   }

323   #endregion

324   #region 处[image][/image]标记
325   //处[image][/image]标记
326   r = new Regex(@"(\[image\])([ \S\t]*?)(\[\/image\])",RegexOptions.IgnoreCase);
327   for (m = r.Match(sDetail); m.Success; m = m.NextMatch()) 
328   {
329    sDetail = sDetail.Replace(m.Groups[0].ToString(),
330     "<img src=\"" + m.Groups[2].ToString() + "\" border=0 align=middle><br>");
331   }

332   #endregion

333
334   return sDetail;
335  }

336  #endregion

337 }

338}

339



posted on 2005-05-10 10:24  阿朴  阅读(372)  评论(0)    收藏  举报

导航