### 在 ASP 中利用“正则表达式” 对象实现 UBB 风格的论坛

上一次，我们谈到在 ASP 中如何利用“正则表达式”对象来实现各种数据的校验，文中描述了正则表达式对象的强大功能，接下来，我们来看看有关“正则表达式”对象的其他功能。当我们在网上冲浪的时候，尤其是浏览各类论坛的时候，经常会见到“UBB 代码”这个词语。什么是 UBB 代码呢？UBB 代码是 HTML 的一个变种,是 Ultimate Bulletin Board (国外一个 BBS 程序，国内也有不少地方使用这个程序)采用的一种特殊的 TAG。为了避免用户无意或者有意的ＨＴＭＬ代码对论坛的攻击，各种论坛基本上都屏蔽了ＨＴＭＬ代码，但是为了使得论坛更加“多姿多彩”，论坛都会相应的开放一些自定义的Ｔａｇ标签，类似于ＨＴＭＬ中的Ｔａｇ，比如“,,[RED],[/RED]”，这样，可以提供一些等同于ＨＴＭＬ代码的功能，又避免了论坛受到恶意攻击，这些自定义的各种Ｔａｇ就是俗称的 UBB 代码。眼下时髦的论坛均支持 UBB 代码，比如：ｈｔｔｐ：／／ｗｗｗ。ｃｈｉｎａａｓｐ。ｃｏｍ（动感技术网络）的论坛就很好的支持 UBB 代码。现在，我们一同使用“正则表达式”对象来实现我们自己的丰富多彩的 UBB 代码吧。
首先，你的服务器端（ＩＩＳ或者ＰＷＳ）要有 VBScript5.0 的支持环境，一般指要安装了 IE5.X 就已经可以支持“正则表达式”对象了。
关于“正则表达式”对象的常见方法、属性的使用方法，我在本刊的“在 ASP 中利用“正则表达式”对象实现数据的校验”一文中已经有详细介绍了，可以参见那一篇文章，在这里，我主要介绍一下实现“UBB 代码”的主要正则表达式对象方法：Replace()方法。
Replace 方法语法如下：
Replace 方法语法如下：
描述
替换在正则表达式查找中找到的文本。
语法
object.Replace(string1, string2)
Replace 方法的语法包含以下几个部分：
部分　　　　　　　描述
object 必需的。总是一个 RegExp 对象的名称。
string1 必需的。string1 是将要进行文本替换的字符串。
string2 必需的。 string2 是替换文本字符串。
说明
被替换的文本的实际模式是通过 RegExp 对象的 Pattern 属性设置的。
Replace 方法返回 string1 的副本，其中的 RegExp.Pattern 文本已经被替换为 string2。如果没有找到匹配的文本，将返回原来的 string1 的副本。
接下来，我们要确定我们最终想要实现一套什么样的 UBB 代码？这次我们要实现的 UBB 代码功能如下：
URL 超级链接
在你的信息里加入超级链接，只要按下列方式套入就可以了(UBB 代码是粗体).
www.test.net
按上例套入，UBB 代码会自动对 URL 产生链接，并保证当用户点击新的窗口时这个链接是打开着的。
电子邮件链接
在你的信息里加入电子邮件的超级链接，只要按照下例套入就可以了（UBB 代码是粗体）
uestc95@263.net
按上例套入，UBB 代码会对电子邮件自动产生链接。
加入图象
在你的信息里加入图象，只要按下例套入就可以了(UBB 代码是粗体).
在上例中，UBB 代码会自动让图象在你的信息里显示。
其他Ｔａｇ
还有这些 tag , u small h1 h2 h3 h4 h5 h6 strike blink sub sup del pre big , 这些 tag 的功能与 html 的功能等同
[h1]这是一个标题[/h1]
[/tag]是必须的
让一段文字使用颜色显示
这是一个特殊的 tag
[#ff0000]一段红色的字[/#]
#后面跟的颜色的 16 进制 RGB 代码，如红色是 ff0000,绿色是 00ff00,而蓝色是 0000ff
至于其他各式各样的 UBB 代码的实现方式同上面的类似，我们就以上面 UBB 代码实现作为例子来讲解“正则表达式”对象的强大功能。
我们主要使用 Replace()方法配合相应的模版，就可以方便的实现 UBB 代码功能了，在这里我们主要用到了两个自己编写的函数，第一个函数 ReplaceTest，这个函数实现的功能主要是将“正则表达式”对象进行了封装，提供三个入口参数：
Patrn
这个参数传递的是 UBB 代码的匹配模版
Str
这个参数传递的是将要以 UBB 方式处理的字符串，比如文章内容。
ReplStr
这个参数传递的是匹配成的ＨＴＭＬ代码语言。
ReplaceTest 函数的出口参数是经过模版匹配替换之后的字符串。
ReplaceTest 函数代码如下：
Function ReplaceTest(patrn,str,replStr)
Dim regEx, str1 ' 建立变量。
str1=trim(str)
Set regEx = New RegExp ' 建立正则表达式。
regEx.Pattern = patrn ' 设置模式。
regEx.IgnoreCase = true ' 设置是否区分大小写。
ReplaceTest = regEx.Replace(str1, replStr) ' 作替换。
set regEx=nothing ‘销毁正则表达式对象
End Function
我们要编写的第二个函数是：UBB()函数。这个函数实现的功能就是将一段文本进行 UBB 功能的转换。这个函数仅仅只有一个入口参数：
Str
这个参数传递要被处理的字符串。
UBB 函数的出口参数是经过 UBB 代码处理过后的字符串。
UBB 函数的代码如下：（程序中有详细注释信息）
Function UBB(str)
dim i,temp ‘声明变量
i=1
temp=""
do while instr(i,str,"[/"]>=1 ‘如果没有达到字符串的末尾
if trim(temp)="" then
temp=ReplaceTest("(\)(\S+)(\)",str,"<i>$2</i>") ‘进行 UBB 代码的模版匹配与替换
else
temp=ReplaceTest("(\)(\S+)(\)",temp,"<i>$2</i>") ‘进行 UBB 代码的模版匹配与替换
end if
temp=ReplaceTest("(\)(\S+)(\)",temp,"<b>$2</b>") ‘进行 UBB 代码的模版匹配与替换
temp=ReplaceTest("(\[big])(\S+)(\[/big])",temp,"<big>$2</big>") ‘进行 UBB 代码的模版匹配与替换
temp=ReplaceTest("(\[strike])(\S+)(\[/strike])",temp,"<strike>$2</strike>")‘进行 UBB 代码的模版匹配与替换
temp=ReplaceTest("(\[sub])(\S+)(\[/sub])",temp,"<sub>$2</sub>")‘进行 UBB 代码的模版匹配与替换
temp=ReplaceTest("(\[sup])(\S+)(\[/sup])",temp,"<sup>$2</sup>")
temp=ReplaceTest("(\[pre])(\S+)(\[/pre])",temp,"<pre>$2</pre>")
temp=ReplaceTest("(\[u])(\S+)(\[/u])",temp,"<u>$2</u>")
temp=ReplaceTest("(\[small])(\S+)(\[/small])",temp,"<small>$2</small>")
temp=ReplaceTest("(\[h1])(\S+)(\[/h1])",temp,"<h1>$2</h1>")
temp=ReplaceTest("(\[h2])(\S+)(\[/h2])",temp,"<h2>$2</h2>")
temp=ReplaceTest("(\[h3])(\S+)(\[/h3])",temp,"<h3>$2</h3>")
temp=ReplaceTest("(\[h4])(\S+)(\[/h4])",temp,"<h4>$2</h4>")
temp=ReplaceTest("(\[h5])(\S+)(\[/h5])",temp,"<h5>$2</h5>")
temp=ReplaceTest("(\[h6])(\S+)(\[/h6])",temp,"<h6>$2</h6>")
temp=ReplaceTest("(\[red])(\S+)(\[/red])",temp,"<font color=red>$2</font>")
'这里可以增加新的 UBB 代码的实现模版
temp=ReplaceTest("(\[email])(\S+)(\[/email])",temp,"<a href=""mailto:$2"" target=_top>$2</a>")
temp=ReplaceTest("(\)",temp,"<img src=""$2"">")
temp=ReplaceTest("(\)(\S+)(\)",temp,"<a href=""$2"" target=_top>$2</a>")
temp=ReplaceTest("(\[#(\S+)])(\S+)(\[/#])",temp,"<font color=$1>$3</font>")‘进行 UBB 代码的模版匹配与替换
i=i+1
loop
if trim(temp)<>"" then
UBB=temp ‘将经过 UBB 代码过滤后的字符串传出
else
UBB=str ‘将经过 UBB 代码过滤后的字符串传出
end if
end function
在函数 UBB 的代码中我们可以看到“$1”，“$2”，“$3”等等，这些字符串就是匹配后的字符串的代词，就如同一些“宏”一样，我们可以使用他们方便代替匹配到的字符串，而不必再使用程序去记住匹配字符串的位置。通过这两个简单的函数调用，我们实现了 UBB 代码的功能，怎么样，很简单吧。
这样，我们只要在显示文章的时候调用 UBB 函数，对文章内容进行处理之后，再显示到浏览器上面，就实现了论坛的 UBB 代码功能。并且，你可以方便的在函数 UBB 添加需要的 UBB 代码匹配替换模版，从而可以不断的扩充你的 UBB 代码的功能。
（以上程序均在 WinNT4.0 英文版 SP5，IIS4.0,IE5.x 中运行通过）