模块的设计
基于WEB的通用BBS系统其系统定义部分采用面对对象的系统分析方法,并结合传统的结构化分析方化,设计出其系统模型,如果采用面向对象的程序设计语言开发系统,则可以很方便地从系统分析阶段平滑地过渡到设计阶段。但是,本系统采用ASP技术, ASP不支持继承和强类型转换等面向对象程序设计所必需的功能,只能采用一定的技术措施,用传统的结构型程序设计方式实现诸如继承等这类功能。下面就部分模块实现做一下简要说明:
1.系统主页面 Main.asp
这是BBS网站的HomePage,程序首先进行用户身份判断。
论坛的用户身份信息经登录后保存在SESSION对象的USERNAME和ADMINBOARD两个变量里。匿名用户(既Guest)这两个变量为空或没有定义;普通用户USERNAME变量有用户在论坛注册的会员昵称,但其ADMINBOARD变量没有定义或为空;版主用户其ADMINBOARD变量保存有他管理版面的ID;如果ADMINBOARD变量为“0”则为超级会员。
依据程序对用户所做的判断,插入相应用户的功能操作菜单。这就实现了不同层次对象的同一方法的不同功能。譬如Guest::main.asp载入的功能菜单为genhead.asp,Super::main.asp载入的功能菜单则为superhead.asp。注意:功能菜单文件其实就是普通的HTML文件,按照各自所属的操作对象列示其相应的功能链接。
2. 各级别用户私有功能的实现方法
私有功能是不能为比其级别高的用户所继承的功能。因此,私有功能ASP网页应进行具体某个级别身份的识别,非这个级别层次的用户则被拒绝访问。
3. 各级别用户公有功能的实现方法
公有功能是可以为比其级别高的用户所继承的功能。因此,公有功能ASP网页只进行比其级别低的用户身份的识别,如果此用户级别低则拒绝继续访问。此外,高级别的用户可以进行功能重载,譬如,匿名用户只能查看论坛会员列表,但是,超级会员在查看的同时,还可以进行管理操作,如修改,删除等。下面是所有公用功能的重载列表:
Guest::useradmin.asp 查看本论坛注册会员列表;
Super::useradmin.asp 查看并管理本论坛注册会员列表;
Guest::adminorlist.asp 查看本论坛版主列表;
Super::adminorlist.asp 查看并管理本论坛版主列表;
Adminor::articleadmin.asp 自已管理辖版面范围内的贴子维护;
Super::articleadmin.asp 本论坛所有版面贴子维护;
Adminor::linkadmin.asp 添加或维护自已曾添加的友情链接;
Super::linkadmin.asp 维护所有友情链接列表;
Adminor::newpost.asp 在自已管理版面发布公告;
Super::newpost.asp 在任一版面发布公告;
4. 会员用户积分的计算模型
会员用户每提交一篇文章,可以积十分。回复某篇文章,则可以积五分,同时原文作者积三分。
5. 版主申请条件以及计算模型
版主申请条件:为正式注册会员;一个会员最多管理二个版面;一个版面最多五个管理员。
计算机模型:用户提出申请,超级用户审批。审批完成前此会员不能再次就同一版面申请版主权限。
6.超文本信息输入
具有普通会员身份以上级别的用户,发表贴子或回复贴子时,可以在其贴子内插入诸如滚动文字,字体大小颜色不同的文字,以及超链接等等。系统接受用户输入时对带格式文本应进行相应的编码(Encode),系统显示带超文本信息的贴子时则应进行相应的解码(Decode)。
5.2 ASP网页数据库的连接
网页数据库的连接方法有两种,一种是DSN数据源,另一种是DSN-less方式,即不建立DSN连接数据。考虑最简单的BBS系统应用环境,使用互联网上免费资源,通常互联网上免费主页空间只支持简单的ASP应用以及Access数据库应用,Access数据库通常要求放置在固定的虚拟目录位置,譬如:[\db]目录位置,数据库的连接也只支持DSN-less方式,这也是自然的。另外,BBS通常只作为Web应用的一部分,或者说作为个人主页或商业网站提供的一个附加功能,这个时候,BBS论坛系统通常都安装在主页空间一个单独的目录下,假定为[\BSS]。
所有要进行数据库存取的ASP网页都要以DSN-less方式进行数据库连接,由此可以将执行数据库连接的ASP代码单独形成一个插入文件,通常插入文件都是以[.inc]作为扩展名,考虑到安全性的需要,防止用户直接输入文件名下载此插入文件,所以仍然以[.asp]作为插入文件的扩展名,比如,将一个用作数据读操作的数据库连接插入文件名命名为[dbconr.asp],下面就是其典型代码:
<%
'adModeUnknown 0 default
'adModeRead 1
'adModeWrite 2
'adModeReadWrite 3
'adModeShareDenyRead 4
'adModeShareDenyWrite 8
'adModeShareExclusive 12
'adModeShareDenyNone 16
strDBPath = Server.MapPath("dbconr.asp")
strDBPath = replace(strDBPath,"\bbs\dbconr.asp","\db\bbsdata.mdb")
strDBConn= "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & strDBPath
Set objDBConn=server.createobject("adodb.connection")
objDBConn.ConnectionTimeOut=20
objDBConn.Mode=1 ‘读模式
objDBConn.open strDBConn
%>
数据库连接操作是一个相当频繁的操作,可以采用适当的技术来进行数据库连接优化,以提高数据库连接性能。在ASP的数据库编程中,connection对象是不可能离开的一个对象,在对数据库进行任何的操作,比如更新记录,插入,删除,检索等,都必须借助于connection对象来完成。形象地来说,connection对象就是程序与数据库沟通的管道,所有对数据库的操作,都必须经过它,因此,无论以何种方式连接数据库前,总是少不了执行下列的代码:
Set objDBConn=Server.CreateObject("ADODB.Connection")。
建立一个connection对象的实例变量,然后才能在它的基础上建立recordset对象或是command对象来操作数据库。既然connection对象是如此的重要,那么如何优化和管理好connection对象对数据库程序来说是极其重要的,它关系到程序的性能。
每当一个客户执行数据库操作时,就需要借助一个connection对象,而每个connection对象就会占用服务器的一部分资源,而数据库的同时连接数不可能是无限的,因此。在考滤要提供高性能的数据库Web程序时,需要考虑如何去减少服务器的开销。一般来说。每个ASP页面中建立一个conn ection对象,都会在服务器中产生一个对数据库的连接。而不同的页面的connection对象是不能共享的。那么。可不可以使同一个用户所访问的不同页面共享一个connection连接通道呢。
回顾一下ASP六大内置对象的session对象,它可以为某个特定的用户来保存私有的数据,如果把connection对象保存在session对象中,是否可以使不同的ASP页面都使用同一个连接通道呢?看看下面的这段程序。
<%
Set objDBConn=Server.CreateObject("ADODB.Connection")
objDBConn.Mode=?
objDBConn.Open"[DSN-less串]"
session("dbconn")=objDBConn
Set rs=Server.CreateObject("ADODB.Recordset")
Commandtext = "select * from userlist"
connstr=session("dbconn")
rs.open Commandtext , connstr , 3 , 2
%>
在这个数据库连接中,使用了session对象,首先,建立一个objDBConn的连接对象,然后连接到数据表userlist中,取得连接句柄后,把它保存在session("dbconn")这个session变量中,在打开记录集前,从session("dbconn")中取出句柄,借助于session对象。可以使不同的ASP页面共用一个连接对象,减少了对服务器内存的开销,而也不需要担心,当一个客户因为错误操作导致服务器不能释放该被占用的session连接对象,因为每个客户的session对象是有一定的生存期限的,过了这个期限,服务器就会自动把它释放掉。
然而,数据库连接性能的提高是以一定的服务器资源消耗为代价的,所以,就要在其中权衡利弊。通常,利用别人的主机空间来作为自已BBS系统的平台,就应该尽谅避免使用过多的服务器资源,诸如APPLICATION以及SESSION变量,反之,主机资源丰富,而应用系统相对较少,则可以考虑采用上述优化方式。
5.3 ASP网页数据库的操作
关于网页数据库的操作,ASP拥有三种方法:ADO组件的Connection对象配合SQL语法;ADO组件的Command对象执行SQL语法;使用ADO组件的RecordSet。每种方法各有特点。
1、ADO组件Connection对象配合SQL语法
在网页上使用SQL指令处理数据的访问,需要使用ADO组件的Connection对象建立数据连接,以便让下达SQL指令到服务器端的数据库,处理表中的记录。参照3.2.3.1ASP网页数据库的连接所介绍的方法,首先建立一个Connection对象;然后再打开DSN-less,同时,根据将要进行数据操作的类型,设置其Mode属性;最后,使用Connection对象的Execute方法下达SQL指令,通常在使用Execute方法执行SQL指令前,应该指定其CommandTimeOut属性。以会员注册为例,用户填写完注册资料以后,提交系统,系统进行用户资料插入操作:
<%
’读取用户提交的资料至各变量
strSQL="INSERT INTO userlist(username,password,question,answer, "
strSQL= strSQL & "email,realname,sex,zjname,zjnumber, "
strSQL= strSQL & "lxway,birthday,homepage,quantity)"
strSQL=strSQL & "VALUES('"
strSQL=strSQL & strUsername & "','"
strSQL=strSQL & strPassword & "','"
strSQL=strSQL & strQuestion & "','"
strSQL=strSQL & strAnswer & "','"
strSQL=strSQL & strEmail & "','"
strSQL=strSQL & strRealname & "','"
strSQL=strSQL & strSex & "','"
strSQL=strSQL & strZjname & "','"
strSQL=strSQL & strZjnumber & "','"
strSQL=strSQL & strLxway & "','"
strSQL=strSQL & strBirthday & "','"
strSQL=strSQL & strHomepage & "','"
strSQL=strSQL & strQuantity & "')"
%>
<!---#include file="dbconrw.asp"--->
<%
objDBConn.Execute strSQL
%>
<!---#include file="dberror.asp"--->
这是最基本的数据库操作方式,特别是对于表的插入、删除和更新记录以及单条数据的查询操作,是三种方式中最为简单有效的一种。设计开发的BBS论坛中,用户身份验证、发表贴子以及回复贴子等相关数据库操作相当频繁,对数据存取效率有相当的要求,至于在数据存取的灵活性方面要求不高,因此,大部分都是采取ADO组件Connection对象配合SQL语法这种数据库操作方式。
2、ADO组件的Command对象执行SQL语法
Command对象和Connection对象的Execute方法一样能够执行SQL指令。在建立Command对象前一样需要建立和打开数据连接,假设活动连接objDBConn已经建立好,其后步骤如下所示:
Step1:建立Command对象,其程序代码如下:
Set objDBCommand=Sever.CreateObject(“ADODB.Command”);
Step2:接着指定ActiveConnection属性为目前打开的数据连接,代码如下:
ObjDBCommand.AvtiveConnection=objDBConn;
Step3:指定CommandText属性为要执行的SQL指令,程序代码如下:
ObjDBCommand.CommandText=“Select * from userlist”;
Step4:使用Execute方法执行SQL指令,objRS就是取得的记录集合,代码如下:
Set objRS=objDBCommand.Execute;
上述步骤可以取得所有注册会员的详细注册资料,至于添加、删除和更新记录只需下达不同的SQL指令。需要注意的是,Command对象并不支持Close方法,所以关闭Command对象,只需设为Nothing即可。
建立复杂的SQL语句,通常得事先进行许多复杂的数据类型转换,使用Command对象配合Parameters数据集合建立SQL指令则相对来说比较简单,因为对象本身就能够自已处理复杂的数据类型转换,另外,比较Connection对象直接执行SQL语句来说,操作要灵活。
Command对象主要的目的是用在存储程序(Store Procedure),简单地说,存储程序是一些默认的处理程序。这个部分需用要数据源本身拥有指令处理的能力,象MS SQL Server就支持存储程序,但MS Access这类中小型数据库系统就不支持存储程序。
应该说,使用存储程序来操作数据库,具有较其它方式较明显的优点,首先,数据存取效率最高,因为存储过程经过了优化和编译,并且在第一次执行以后,就驻留在缓存中,另外,用户不必在网络上发送有时数以百计的SQL语句,只需通过执行一个简单的存储过程,就能够完成复杂的操作,减少了客户和DB服务器间传递的请求数目,减少了网络通信量。
设计开发的BBS论坛采用MS Access数据库,所以本方法作为未来系统扩展升级时数据库操作的首选方法。
3、使用ADO组件的RecordSet
RecordSet对象为ADO组件最重要的对象,从英文名字看来就是“记录集合”。它将表全部或部分的记录内容,象使用容器一样暂放所需的记录,RecordSet对象能够显示表的内容或进行记录数据的分析处理。
数据的目的是在访问、建立和处理记录,表的内容是由记录所组成。当在表中查询所需的数据时,其实就是在表的记录间寻找,RecordSet对象的记录集合可以把所需的记录取出,使用表格的方式,每一行就是一条记录,提供ASP程序一致的数据处理方式。
数据本身其实就是一个虚拟的表格,为什么一定要将它取出放入RecordSet对象容器,然后再进行处理呢?这是因为ADO组件数据源不见得就是数据库表,它可能是一个文本文件,而且所需的数据可能只有几笔,并不需要打开整个表提供全部的记录。直接在表中处理并没有效率,不如在RecordSet记录集合处理后,再更新表的记录,反而较有效率。
总之,不论数据源到底是什么,通过RecordSet对象的记录集合,就可以在ASP程序使用一致的方法处理数据,不论是文本文件、Excel还是数据库,它都是一个表格的记录集合。
在使用ADO组件的RecordSet对象时,因为处理的对象是记录集合,不是表的记录本身,所以,如果记录改变了,一定在用Update方法更新表,才能真正修改表的记录内容。
在数据的查询方面,RecordSet对象的使用相当灵活,虽然RecordSet对象一样可以插入、更新和删除记录,此时直接使用SQL指令反而较有效率。例如:只是插入一条记录,为什么需要建立RecordSet对象的记录集合,然后再更新记录?这在实际操作时,反而多此一举。但是,如果是从表中提取记录集合,然后要对记录进行相对较为复杂的分组分页显示,则使用RecordSet对象来操作数据比起SQL方式来要简单得多。论坛中象会员列表查询或是版主列表查询都采用ADO组件的RecordSet数据操作方式。
5.4 ASP网页安全性的实现方法
在用浏览器浏览HTML网页时,浏览器会将HTML文件原封不动地全部下载下来,然后再由浏览器解释执行,因而很容易就能看到HTML文件的全部源代码,这对于那些含有保密内容的网页来说是十分不安全的。为了提高网页的安全性,采用了ASP网页,前面说过,ASP网页是一种动态网页,它是由服务器中的ASP程序运行产生的动态页面,而ASP的源代码又是全部保存在服务器上的,所以从客户端的角度,ASP源代码是保密的。所以,可以利用ASP网页ASP源代码的保密性来实现ASP网页只能被具有相应权限的合法用户访问。
本BBS论坛系统有会员身份权限限制的功能网页相当多,频繁地要求用户输入用户名以及密码,然后比较数据库中会员注册表数据以确认用户身份,再根据用户的身份来确定是否具有本网页的访问权,将会消耗大量的服务器资源,极大地增加Web服务器的负担。此时,可以利用ASP的内置对象Session。
当一位尚未建立Session对象的用户浏览到WEB站点的ASP程序时,ASP就会自动产生一个新的Session对象,并且指定唯一的SessionID编号。此后,在浏览此ASP程序和即将在站点内浏览其它ASP程序的过程,称为一个Session期间。WEB服务器可以凭借读取ASP程序时传送的SessionID判断用户是否仍在Session期间,直到Session对象TimeOut属性所设置的时间,默认为20分钟或执行Abandon方法。每当读取新的ASP程序后,TimeOut属性都会归零,重新计算,所以除非没有浏览站点,否则Session期间绝对超过20分钟。
每一位用户都可以拥有一组专用的Session变量。虽然每位用户的Session变量名称相同,但是其内容可就不同,而且只有该用户拥有权利读写自已的Session变量,可以利用Session的这个特性来实现ASP网页的安全保护。
在论坛设计了一个ASP网页userlog.asp,如果用户想以普通会员的身份发表贴子,或以版主身份管理版面,或以超级管理员身份进行论坛管理,则用户在进入系统之前必须通过userlogin.asp进行登录,login.asp会将用户输入的用户名及密码拿来与数据库中的资料相对比,以确定用户的合适身份,否则,用户只能以匿名用户身份浏览本论坛贴子,却不能发表贴子或回复贴子,当然更不能进行论坛的相关管理操作了。用户的身份将被写入Session对象的username以及adminboard变量,username保存其会员名称,adminboard保存其操作权限,为“0”则其为超级会员,为空则为普通会员,1为版面ID则为版主。
userlog.asp部分核心源代码如下:
<!--#include file="dbconrw.asp"-->
<%
response.expires=0
On Error Resume Next
Dim strUserName
Dim strSQL,objRS
strUserName=Request.Form("username")
strUserPassword=Request.Form("password")
strSQL="SELECT * FROM userlist WHERE username='" & strUserName & "'"
set objRS=objDBConn.Execute(strSQL)
session("username")=""
session("adminboard")=""
Dim bLogSucc,repmsg,reptxt,repurl
If objRS.EOF Then
'User Doesn't Exists
bLogSucc=0
repmsg="此用户不存在"
repurl="userlog.asp"
reptxt="请重新登录"
Else
'User Exists
If objRS("password")=strUserPassword Then
bLogSucc=1
session("username")=strUserName
repmsg="欢迎您的到来" & strUserName & ",您已登录成功"
repurl="main.asp"
reptxt="返回论坛首页"
Else
bLogSucc=0
repmsg="密码输入错误"
repurl="userlog.asp"
reptxt="请重新登录"
End if
End If
%>
<!--#include file="dberror.asp"-->
<%
'Write Log
objRS.close
strSQL="INSERT INTO loginfo(userid,userip,intime)"
strSQL=strSQL & "VALUES('" & strUserName & "','"
strSQL=strSQL & request.servervariables("remote_host") & "','"
strSQL=strSQL & now() & "')"
set objRS=objDBConn.execute(strSQL)
if err.number<>0 then
response.write "数据库操作失败:"&err.description
end if
end if
objRS.close
objDBConn.Close
Set objRS=Nothing
Set objDBConn=Nothing
%>
确定了用户的会员身份以后,在每个需要进行身份识别的ASP网页插入身份识别代码,如果此用户具有访问这个ASP网页的权限,则输出其相应的HTML文件,否则,系统转到用户登录网页要求用户重新登录以取得访问此ASP功能网页的合法身份。例如,论坛基本信息设置ASP网页需要访问者具有超级会员身份,在本网页前必须插入以下一段代码:
<%
'Check the Super Administrator Right
Response.Expires=0
if Session("adminboard") <> "0" Then
Response.redirect "userlog.asp?errmsg=您没有超级用户管理权限,请重新登录或退出!"
End If
%>
5.5 在贴子中实现超文本信息输入和显示
论坛可以由管理员设置是否支持UBB标签,UBB标签就是不允许使用HTML语法的情况下,通过论坛的特殊转换程序,以至可以支持少量常用的、无危害性的HTML效果显示。而对于那类带有恶意代码的文本予以屏蔽。下面为设计开发的BBS论坛支持的UBB具体使用说明:
[B]文字[/B]:在文字的位置可以任意加入您需要的字符,显示为粗体效果明。
[I]文字[/I]:在文字的位置可以任意加入您需要的字符,显示为斜体效果。
[U]文字[/U]:在文字的位置可以任意加入您需要的字符,显示为下划线效果。
[URL]HTTP://www.163.com[/URL] 。
[EMAIL]sch_bing@163.com[/EMAIL] 。
[img][/img]:在标签的中间插入图片地址可以实现插图效果。
[flash]Flash连接地址[/Flash]:在标签的中间插入Flash图片地址可以实现插入Flash。
[code]文字[/code]:在标签中写入文字可实现html中编号效果。
[quote]引用[/quote]:在标签的中间插入文字可以实现HTMl中引用文字效果。
[list]文字[/list] [list=a]文字[/list] [list=1]文字[/list]:更改list属性标签,实现HTML目录效果。
[fly]文字[/fly]:在标签的中间插入文字可以实现文字飞翔效果,类似跑马灯。
[move]文字[/move]:在标签的中间插入文字可以实现文字移动效果,为来回飘动。
[color=颜色代码]文字[/color]:输入您的颜色代码,在标签的中间插入文字可以实现文字颜色改变。
[size=数字]文字[/size]:输入您的字体大小,在标签的中间插入文字可以实现文字大小改变。
[face=字体]文字[/face]:输入您需要的字体,在标签的中间插入文字可以实现文字字体转换。
[DIR=500,350]http://[/DIR]:为插入shockwave格式文件,中间的数字为宽度和长度。
[RM=500,350]http://[/RM]:为插入realplayer格式的rm文件,中间的数字为宽度和长度 。
[MP=500,350]http://[/MP]:为插入为midia player格式的文件,中间的数字为宽度和长度 。
[QT=500,350]http://[/QT]:为插入为Quick time格式的文件,中间的数字为宽度和长度 。
[URL=HTTP://www.163.com]网易[/URL]:有两种方法可以加入超级连接,可以连接具体地址或者文字连接。
[align=center]文字[/align]:在文字的位置可以任意加入您需要的字符,center位置center表示居中,left表示居左,right表示居右。
[EMAIL=MAILTO:sch_bing@163.com]feng[/EMAIL]:有两种方法可以加入邮件连接,可以连接具体地址或者文字连接。
[glow=255,red,2]文字[/glow]:在标签的中间插入文字可以实现文字发光特效,glow内属性依次为宽度、颜色和边界大小。
[shadow=255,red,2]文字[/shadow]:在标签的中间插入文字可以实现文字阴影特效,shadow内属性依次为宽度、颜色和边界大小。
1、超文本信息的输入
用户在书写贴子内容时,可以输入这类带格式文本,例如,用户希望输入一段红色文字“警告:大家注意了,我在灌水”,则应照这种格式输入文本“[color='red']警告:大家注意了,我在灌水[/color]”。系统在用户输入贴子界面应提供UBB使用帮助链接,对于一些常用的UBB标签,系统应提供其快捷输入方式。例如,界面提供一个输入飞行文字UBB标签快捷按钮,用户单击此按钮,系统则弹出一个文本输入框,用户在其中输入文字,完成提交后,系统将自动在贴子内容输入滚动文本框内文字的末尾添加带有飞行文本标签的这段文字。其实现代码如下(采用JavaScript编写):
……
<title>……</title>
<SCRIPT language="JavaScript">
……
function fontchuli(){
if ((document.selection)&&(document.selection.type == "Text")) {
var range = document.selection.createRange();
var ch_text=range.text;
range.text = fontbegin + ch_text + fontend;
}
else {
document.kbbs.body.value=fontbegin+document.kbbs.body.value+fontend;
document.kbbs.body.focus();
}
}
function fly() {
fontbegin="[fly]";
fontend="[/fly]";
fontchuli();
}
……
</SCRIPT>
……
<form method="?" action="?" name="kbbs">
……
功能按钮:<IMG οnclick=fly() alt=飞行字 src="pic/fly.gif" border=0>
……
</form>
文本在提交后,系统在保存此贴子之前,应该将提交的贴子的标题、贴子内容作适当的转换,比如,用户输入的‘<’以及‘>’等字符,应该转换成HTML非保留字符。采用Server对象的HTMLEncode方法。
假设贴子的标题以及内容分别被存放在title以及body这两个变量里,转换代码如下:
……
title=Server.HTMLEncode(title)
body=Server.HTMLEncode(body)
2、超文本信息的显示
保存在数据库贴子数据表中的相关贴子标题以及内容的数据,是经过了HTMLEncode方法处理过的数据,而且数据中包含了大量的UBB标签,在显示贴子之前,应该将那些UBB标签作适当转换,以使用户浏览器能对其进行正确解释。
RegExp提供简单的正则表达式支持功能,它包括一系列的属性和方法,用于从一段文本中进行正则表达式模式匹配,找出或用一段文字替代与之相匹配的文本。
在VBScript对象包含三个属性以及支持三个方法,下面分别说明如下:
I、Global属性
设置或返回一个 Boolean 值,该值指明在整个搜索字符串时模式是全部匹配还是只匹配第一个。使用语法:object.Global [= True | False ],object 参数总是 RegExp 对象。如果搜索应用于整个字符串,Global 属性的值为 True,否则其值为 False。默认的设置为 True。
II、IgnoreCase属性
设置或返回一个Boolean值,指明模式搜索是否区分大小写。使用语法:object.IgnoreCase [= True | False ]。object 参数总是一个 RegExp 对象。如果搜索是区分大小写的,则 IgnoreCase 属性为 False;否则为 True。缺省值为 True。
III、Pattern属性
这是正则表达式对象最重要的一个属性,设置或返回被搜索的正则表达式模式。使用语法:object.Pattern [= "searchstring"]。正则表达式对象将根据其正则表达式进行相应的模式匹配。
VI、Replace方法
替换在正则表达式查找中找到的文本。使用语法为:object.Replace(string1, string2)。Replace 方法的语法包含以下几个部分:object是必需,总是一个 RegExp 对象的名称;string1是必需的,string1 是将要进行文本替换的字符串;string2是必需的,string2 是替换文本字符串。被替换的文本的实际模式是通过 RegExp 对象的 Pattern 属性设置的。Replace 方法返回 string1 的副本,其中的 RegExp.Pattern 文本已经被替换为 string2。如果没有找到匹配的文本,将返回原来的 string1 的副本。
V、Execute方法
对指定的字符串执行正则表达式搜索。使用语法为:object.Execute(string)。Execute 方法的语法包括以下几个部分:object是必需的,总是一个 RegExp 对象的名称;string也是必需的,要在其上执行正则表达式的文本字符串。正则表达式搜索的设计模式是通过 RegExp 对象的 Pattern 来设置的。Execute 方法返回一个 Matches 集合,其中包含了在 string 中找到的每一个匹配的 Match 对象。如果未找到匹配,Execute 将返回空的 Matches 集合。
VI、Test方法
对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。使用语法为:object.Test(string)。Execute 方法的语法包括以下几个部分:object 必需的,总是一个 RegExp 对象的名称;string 必需的,要执行正则表达式搜索的文本字符串。正则表达式搜索的实际模式是通过RegExp对象的Pattern属性来设置的。RegExp.Global属性对Test方法没有影响。如果找到了匹配的模式,Test方法返回True;否则返回False。
比如,要在将一段文本中所有fox或Fox字符串替换成cat,其示例代码如下:
Dim regEx, str1 ' 建立变量。
str1 = "The quick brown fox jumped over the lazy dog."
Set regEx = New RegExp ' 建立正则表达式。
regEx.Pattern = "fox" ' 设置模式。
regEx.IgnoreCase = True ' 设置是否区分大小写。
ReplaceTest = regEx.Replace(str1, replStr) ' 作替换。
在论坛中,假设Body变量为用户保存的贴子内容,其中包含有UBB标签文本,要将其转换成用户浏览器可以识别的格式。
照此方法,实现对另外的UBB标签的正确转换,转换的关键是构造出正确的正则表达式。在系统中,系统支持的所有UBB标签转换正则表达式全部包括在ubb.asp文件中的code_jk函数中。