UBB(c#完整版)(我的小毛驴)(2005年) 选择自 hushiyuhsy 的 Blog
最近我又开始用c#做论坛,在网上找了一下,虽然也有关于ubb(c#)的转换代码,可是同样都不全面,我在这里补充了一下,拿出来和大家共享。
有什么问题到我个人的论坛[url=http://www.hushiyu.com]www.hushiyu.com[/url]来交流,随时欢迎。
1
using System;
2
using System.Text;
3
using System.Text.RegularExpressions;
4
5
namespace 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(" "," ");
31
#endregion
32
#region 处理单引号
33
sDetail = sDetail.Replace("'","’");
34
#endregion
35
#region 处理双引号
36
sDetail = sDetail.Replace("\"",""");
37
#endregion
38
#region html标记符
39
sDetail = sDetail.Replace("<","<");
40
sDetail = sDetail.Replace(">",">");
41
42
#endregion
43
#region 处理换行
44
//处理换行,在每个新行的前面添加两个全角空格
45
r = new Regex(@"(\r\n(( )| )+)(?<正文>\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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
浙公网安备 33010602011771号