封面

欢迎使用 申江ASP留言本 标准版 帮助手册

对应版本：(SS)1.19

MJ PC Lab 版权所有

http://mjpclab.net


序言

    由于静态网页的交互性较差，越来越多的网站开始采用动态网页技术，无论是企业还是个人，都纷纷投入到这场动态网页的热潮中。作为交流平台，站长们一般选择论坛或留言本与用户交流。对于交流问题比较广泛的站点，可以采用论坛进行分类讨论，而交流内容相对单一的站点，留言本已能很好地满足需求。
    申江ASP留言本为您提供留言解决方案，本留言本从用户和管理员两个角度出发进行设计，力求用户留言方便快速，管理员的管理策略全面周到，为两者的互相沟通扫清障碍。
    本留言本最主要致力于解决留言的“非正常干扰”问题，如果有用户经常发一些垃圾信息或非法信息，管理员可以通过屏蔽IP或者添加过滤策略来阻止这些行为。特别地，过滤策略引入正则表达式（表述某种文字规律的语言），使任何试图在非法信息中加入干扰信息而逃避过滤的留言无藏身之地！另外，对于某些人通过“群发工具”之类的软件从外部提交数据的问题，本留言本引入验证码来解决，这样只有用户通过浏览器手动浏览网页，才能识别到验证码，进行正常的数据提交。 如果还有漏网之鱼，那么站长可以启用审核功能，任何访客的留言都需要经过审核才会真正显示。
    本留言本的其它特色还包括留言搜索、根据条件批量删除（高级删除）留言、配置界面尺寸、支持多种配色方案等，相信这些功能会对站长的个性化配置大有帮助。


快速使用指南

    如果您已构建好了支持ASP动态页面的服务器，那么您可以立即将留言本程序放在对应的Web目录中。MJ PC Lab不建议将留言本放在Web网站根目录，因为那样会与其它文件混淆，甚至产生重名问题，除非您确定当前服务器只用来提供留言服务。这里假设用"gbook"这个目录名（目录亦称“文件夹”），您可以在网站根目录新建一名为gbook的目录，然后把留言本程序复制到该目录中。如果您有IIS管理权限，那么另一种方法是在IIS中新建一虚拟目录gbook，虚拟目录可以与Web根目录实际位置不相干。然后将留言本程序复制到gbook对应目录下即可。
    文件复制完成后，您可以用http://您的网站/留言本目录/index.asp来访问留言本首页，默认管理员密码为8888，您可以根据需要进行配置。


详细配置与使用指南

系统需求：

使用本留言本的系统要求。

IIS配置说明：

配置IIS建立Web服务器，并支持留言本运行。

留言本配置与管理：

配置留言本的各项参数，以满足不同的需要。

留言功能说明：

访客留言的使用方法。

高级调整与维护指南：

对有一定水平的站长提供的更个性化的配置指南。


系统需求

推荐使用IIS作为Web服务器：

    申江ASP留言本使用ASP（Active Server Pages，动态服务器端页面）技术来构建动态页面，因此您的服务器必须支持ASP文件的解析。目前对ASP支持最好的还是微软自家的IIS（Internet Infomation Server，互联网信息服务器），在Windows 2000及以上版本得到了很好的支持，MJ PC Lab也推荐IIS作为本留言本的运行平台。
    ASP的发展也经历了不同的版本，Windows 2000自带的IIS可以很好地支持 ASP 3.0，这也是本留言本的需求。而如果您使用的是Windows NT系统，可能需要一定的升级措施。MJ PC Lab不推荐您使用PWS（Personal Web Server，个人网页服务器）来构建Web站点，因为它只支持ASP 2.0。

Windows Script 5.6：

    本留言本需要用到正则表达式对象（这也是大多数论坛程序所需要的），所以系统的Windows Script版本应至少为5.6，您可以通过Windows Update（http://windowsupdate.microsoft.com）进行自动升级，也可到下面的网页手动下载：

用于Windows 2003的Windows Script 5.6
http://www.microsoft.com/downloads/details.aspx?FamilyID=887fce82-e3f5-4289-a5e3-6cbb818623aa&displaylang=zh-cn

用于Windows 2000和XP的Windows Script 5.6
 http://www.microsoft.com/downloads/details.aspx?FamilyID=c717d943-7e4b-4622-86eb-95a22b832caa&displaylang=zh-cn

用于Windows NT和98/ME的Windows Script 5.6
 http://www.microsoft.com/downloads/details.aspx?FamilyID=0a8a18f6-249c-4a72-bfcf-fc6af26dc390&displaylang=zh-cn


IIS配置说明

IIS的安装：

    Windows 2000 Server版已默认安装了IIS服务器，如果您的服务器尚未安装IIS，可以参考如下的安装说明，否则请跳过此节。

    在“控制面板”的“添加/删除程序”窗口左侧选择“添加/删除 Windows 组件”，稍候弹出一组件选择窗口，如下图：

如果操作系统为Windows Server 2003，请进入“应用程序服务器”子项。
在其中选择“Internet 信息服务(IIS)”一项，单击“详细信息”按钮，弹出如下图所示窗口：

这里选择“Word Wide Web 服务器”，另一些需要的组件会被自动选择，这里您还可以安装FTP服务，如果您有兴趣可以自行研究。单击“确定”回到上一窗口，单击“下一步”，插入Windows安装光盘，等待完成即可。

    安装结束后，将增加两项系统服务，分别为“IIS Admin Services”和“World Wide Web Publishing Service”，要使IIS服务器运行，这两项服务缺一不可。另外，如果您使用Windows 2000/XP Professional版操作系统，那么并发连接数被限制在10个。
    打开浏览器，在地址栏输入“localhost”或“127.0.0.1”，如果能看到关于IIS的页面，则说明IIS安装成功。访问时可能会出现权限错误警告，没关系，只要安装成功即可。现在，您的服务器已成为一台Web网页服务器，他人通过IP地址或计算机名（局域网中）即可访问服务器对应目录下的网页文件。这里127.0.0.1是保留地址，特指本机，因此被称为“本地回 路地址”；localhost与127.0.0.1等效（参考hosts文件：Windows目录\system32\drivers\etc\Hosts）。

IIS的配置：

启动IIS管理器：

    在“管理工具”中启动“Internet 服务管理器”，或者直接运行inetmgr.exe。 也可以在IIS管理器中连接远程IIS服务器，在左方树形列表的根“Internet 信息服务”单击右键，点击“连接”，输入计算机名、IP、或域名。

设置Web根目录：

    展开计算机名，右键单击其下的“默认Web站点”，选择“属性”，在“主目录”页的“内容来源”选择“此计算机上的目录”，然后在其下的“本地路径”中输入Web根目录所在的实际位置。如果要支持ASP解析，在“执行许可”中选择“纯脚本”，否则选择“无”。
    在“文档”页，列出了访问某一目录而未给出文件名时，IIS默认显示的文件，它将按照列表中的次序依次寻找这些可能的默认文件，并显示之，建议您在其中添加“index.asp”一项，并根据需要改变次序。

放置留言本程序：

    假设留言本的访问路径为“http://站点/gbook”，可以在Web根目录下新建gbook目录，将留言本程序复制到该目录下。如果根目录没有分配脚本执行权限，您可以另建含有脚本权限的虚拟目录。方法是在“默认Web站点”上点击右键，选择“新建”→“虚拟目录”，在向导的别名中输入“gbook”，目录可以选择与Web根目录不同的位置，权限选择“读取”和“运行脚本”。然后按照设置Web根目录的方法，同样在“属性”中添加默认文档“index.asp”。

IIS安全小工具(IIS Lockdown)：

    IIS的某些功能可能实际使用时并不需要，打开这些功能反而可能带来安全隐患，比如曾经名噪一时的Webdav漏洞。只要安装IIS Lockdown，便可将该功能关闭，降低安全隐患，当然可以关闭的选现不止Webdav一项。在安装IIS Lockdown时，请将服务器角色选为“Active Server Pages (ASP)”。如果安装失败，请先重启服务器，然后手动停止World Wide Web Publishing Service服务，再重新安装。
    Windows Server 2003的用户无须安装此工具，因为新的IIS管理器已集成这些功能。

IIS Lockdown的下载地址是：
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=DDE9EFC0-BB30-47EB-9A61-FD755D23CDEC


数据库配置

config.asp文件配置：

在config.asp中配置连接数据库所需的参数。

初始化数据库：

对数据库进行建表、初始化或者对旧版本数据库进行升级。

从Access升级到SQL Server：

将留言本Access数据库升级为SQL Server。


config.asp文件配置

    请用任意文本编辑器打开config.asp，进行连接数据库的配置。如果您决定使用Access数据库，并且并不精通下文的内容，可以跳过此页，默认的配置已经能很好地满足您的需要了。

dbtype：

    设置留言本所使用的数据库类型，可选值如下：

1 - Access 97
2 - Access 2000/2002/2003
10 - SQL Server 7.0/2000/2005

prefix：

    设置数据库表名前缀。如果您决定将多个程序所使用的数据库整合在一个数据库中，一个不得不考虑的问题是如何防止这些程序所使用的数据库表名发生冲突？在申江留言本中已经内建了对表名前缀的支持，设置此参数后，留言本所有的数据库操作都会自动寻找包含表名前缀的数据表。如不使用表名前缀，此项留空（请不要去除双引号）。

Access数据库专用参数：

dbfile：

    设置Access数据库文件相对于留言本主目录的位置（即index.asp所在目录）。

SQL Server数据库专用参数：

dbserver：

    设置服务器名或IP地址。如果使用SQL Server默认实例，填写计算机名或IP地址，否则填写“服务器名\实例名”或“IP地址\实例名”。如服务器为MSDE/SQL Server 2000个人版，则不支持TCP/IP连接方式，只能使用计算机名访问。

dbport：

    设置SQL Server服务器TCP/IP连接的端口号，如使用默认的1433端口，可以省略不填。如服务器为MSDE/SQL Server 2000个人版，此处不填。

dbuserid：

    连接数据库时使用的登陆名。

dbpassword：

    连接数据库时使用的登陆密码。

dbcatalog：

    设置所使用的数据库名称，如不填则使用默认数据库。

dbschema：

    设置数据表所属的架构名。“架构名”在SQL Server 2000中称为“所有者”，从2005版起，登陆名和架构分离，以便提供更好的管理机制，相关内容请参考微软的联机帮助。如果您使用的是SQL Server的7.0/2000版本，此参数就是指“所有者”；如果您使用2005或更高版本，此参数指“架构名”。如果留空，则使用当前登陆用户的默认架构/所有者。如您不清楚此项设置的含义，建议将它设置为“dbo”。


初始化数据库

初始化新数据库：

    如果您决定使用Access数据库，并且并不精通下文的内容，可以跳过本节，默认的配置已经能很好地满足您的需要了。

    初始化数据库指对数据库进行建表和初始化数据等操作。如果想和其它程序共用Access数据库，可以对现有数据库进行初始化，否则可以跳过初始化步骤，直接使用默认提供的Access数据库。当然您也可以在新建的空Access数据库上进行初始化，这和默认数据库的来历别无二致。
    使用SQL Server数据库的用户必须进行初始化的操作。

    请打开附件中的管理工具，点击“连接数据库”按钮，并填入适当的参数。Access用户请填入数据库所在位置，也可按“浏览”查找文件。SQL Server用户的连接设置与config.asp中关于SQL Server专用参数的设置方法相同。

    最下方的“表名前缀”选项应该与config.asp中关于表名前缀的设置保持一致（如图），它将作为建表及其它操作的依据。

    转到“新建表”页，单击“创建表”按钮，请稍候数秒，待操作完成，结束数据库初始化工作（如图）。

升级旧版数据库：

    一般来说，申江留言本在推出新版时为实现一些新功能而需调整数据库的内部结构。使用升级数据库功能，可使您在保留旧有数据的前提下，安全地对数据库结构进行调整以配合新版留言本程序的使用。进入管理工具后转到“升级数据库”页，单击“开始升级”按钮进行升级。Access数据库用户在升级后须覆盖上传升级后的数据库文件。


从Access升级到SQL Server

准备工作：

    使用附件中的管理工具完成如下步骤：

  1. 升级现有Access数据库到新版本。
  2. 初始化SQL Server数据库，和普通初始化不一样的是在初始化之前需要选中“不添加初始数据”的复选框，因为这些数据都由原数据库导入。

导入数据：

    使用SQL Server提供的数据转换工具从Access导入数据，具体方法请参考相关资料 ，注意导入时在每个表上启用标识插入，以便ID字段的数据能被正确导入。Access数据库中用于防止被下载而设立的“_dlguard”表无需被导入。

重新配置config.asp：

    配置config.asp以使留言本可以连接到SQL Server数据库。


留言本配置与管理

进入/退出管理界面：

进入/退出管理界面的方法。

修改密码：

修改管理员密码。

留言本参数：

配置留言本的核心参数。

IP屏蔽策略：

通过一定的策略屏蔽某些IP的访问。

内容过滤策略：

检查内容中是否含有某些文字（支持正则表达式），如果是，可以去除这些文字，或者直接拒绝留言。

留言管理：

留言的常规管理工作，如回复、删除等。

高级删除：

根据一定的条件批量删除留言。

发布置顶公告：

置顶公告出现在留言显示页面及搜索页面最上端。

修改版主资料：

修改管理员资料，将在留言回复的版主资料中得以体现。

查看访问统计：

查看站点访问的统计报告。

压缩数据库：

整理数据库，减小文件体积。


进入/退出管理界面

进入管理界面：

    请在留言本的默认首页（index.asp）右上方或右下方点击“管理”进入管理界面，也可直接访问文件admin_login.asp。新配置的留言本初始密码为8888，请在第一时间进行修改，详细请参看“修改密码”。除了输入正确的管理员密码，如果留言本参数中的“验证码长度”参数设置了大于0的数，将同时要求输入正确的验证码，方可进入管理界面。

退出管理界面：

    请在管理界面上方的“管理员工具”中选择“退出管理”，并等待页面转到默认首页为止。


修改密码

    请在管理界面上方的“管理员工具”中选择“修改密码”，管理员共需输入三项内容。
    第一项为修改前的原密码，这是为了防止管理员离开计算机时，他人恶意修改密码而作的保护。
    第二、三项为修改后的新密码，为防止新密码输入错误，系统要求管理员输入两次新密码。
    只有当输入的原密码正确，两次输入的新密码一致，重设密码才会生效，并返回管理界面首页，否则，将提示管理员相应的错误。


留言本参数

    请在管理界面上方的“管理员工具”中选择“留言本参数”，留言本的各项参数配置将在该页进行。

基本配置：

留言本中最基本、最重要、最核心的参数配置。

界面尺寸：

允许站长根据需要更改各页面元素的尺寸大小。

功能设置：

留言本的扩展功能设置。


留言本参数 基本配置

留言本参数

基本配置：

留言本状态：

    此项用于设定留言本的开关状态，如果设为“关闭”，那么访客将无法浏览留言、搜索留言，并显示留言本已关闭的错误信息，即使访客留言权限开启也无法留言，即使访客搜索留言权限开启也无法搜索。但留言本的关闭并不会影响管理员进入管理界面，同时出错页面仍然提供了管理登录的超链接。

访客留言权限：

    此项用于设定访客是否可以留言，如果处于关闭状态，则访客无权留言，同时留言的超链接被隐藏，即使直接访问留言页面，也会得到留言功能已关闭的错误信息。至于访客能否浏览已有的留言，取决于留言本状态。

访客搜索留言权限：

    此项用于设定是否为访客提供留言搜索功能，如果关闭，则页面下方的搜索框会消失。访客可以搜索的项目远没有管理员搜索界面的多，也不支持用通配符“%”和“_”的模糊搜索。待审核的留言不会出现在搜索结果中；无法通过标题和内容搜索出悄悄话。

留言显示前需审核：

    开启此项后，访客签写的留言并不会立即显示，而只显示头像和日期，标题和留言内容被“留言待审核”的文字取代。管理员必须人工审核并通过，才会被真正显示出来。

悄悄话功能：

    此项开启后，在“签写留言”页面会多出“悄悄话”的选项，勾选此项后留言，那么只有管理员才有权限查看该条留言，普通访客将显示为“给版主的悄悄话”，但回复仍然是公开的，除非访客为悄悄话加密。如果开启了审核选项，仍然需要首先审核。

访客为悄悄话加密：

    在开启悄悄话的前提下，开启此项将在“签写留言”页面多出“加密悄悄话”的选项，访客可以为悄悄话设定密码。若留言无需审核或已通过审核，访客可以单击留言查看窗口右下方的超链接（如下图）进入验证页面，输入正确的密码后方可查看留言/版主回复。

允许访客回复：

    当开启此选项时，访客可以对其它留言者发起的留言进行回复，且回复次数没有限制。管理员可以针对每位访客的留言分别进行回复。

所属网站Logo地址：

    如果留言本标题栏处于显示状态，其左方将显示您在这里所指定的Logo图片。

所属网站名称：

    这里填写网站名称，将在留言本标题栏出现“网站名 >> 留言本”的导航格式。

所属网站地址：

    如果此项和网站名称均填写，网站名称将变成超链接，链接到您所填写的地址上。

管理员默认HTML权限：

    指定管理员在“回复”和“发布置顶公告”页默认情况下“HTML”、“UBB”、“换行”是否已选中，不影响管理员的实际权限。

访客HTML权限：

    指定访客在留言时所拥有的特效权限，支持HTML、UBB，则访客可以使用这些元素的特效，否则以原文显示。“访客不支持HTML和UBB时允许回车换行”表示HTML和UBB不被支持时，换行符的处理方式。不选择时，换行将被空格替代，否则显示真正的换行。

管理员登录超时(分)：

    管理员在进入管理界面后，一定时间内没有动作，登录状态会自动失效，这里指定失效的时间。失效后，任何操作都需要重新进行登录。

为访客显示IP前n位：

    为访客显示4位IP的前多少位，不显示则设为0。

为管理员显示IP前n位：

    为管理员自身显示4位IP的前多少位，不显示则设为0。

为管理员显示原IP前n位：

    为管理员自身显示4位原IP的前多少位，不显示则设为0。

登录验证码长度：

    此项设定在“管理员登录”、“查看已加密悄悄话”时需输入的验证码位数。如果不使用验证码，请将登录验证码长度设位0，验证码输入框不会显示。

留言验证码长度：

    此项设定在“签写留言”时需输入的验证码位数。如果不使用验证码，请将登录验证码长度设位0，验证码输入框不会显示。


留言本参数 邮件通知

留言本参数

邮件通知：

新留言到达通知：

    设置留言本有新留言时，是否用邮件通知管理员。

版主回复通知选项：

    开启此项时，“签写留言”页面会多出回复后邮件通知的选项。访客输入邮件地址并勾选回复通知项后，管理员一经回复，便会以邮件方式通知留言者，并给出查看地址。如果访客勾选了邮件通知，但此后本选项被关闭，管理员再回复时就不会通知访客。

邮件发送组件：

    服务器上至少需要安装一种邮件发送组件，才能实现邮件自动通知功能。这里可选JMail和CDO。管理员可根据服务器支持情况进行选择。

新留言通知接收地址：

    “新留言到达通知”启用时，设置通知发送的目的邮件地址。

发件人地址：

    此项设置“新留言通知”和“回复通知”的发件人地址，可以是虚假的，甚至根本不是一个有效的邮件地址，但这样可能会被作为垃圾邮件而过滤，甚至在发送时就遭服务器拒绝。

发件人SMTP服务器地址：

    设置发送邮件的SMTP服务器地址。

登录用户名(如需要)：

    如果SMTP服务器需要身份验证，此项需填写。

登录密码(如需要)：

    如果SMTP服务器需要身份验证，此项需填写。

邮件紧急程度：

    设置邮件的紧急程度，范围是1～5，1为最快，5为最慢。


留言本参数 界面尺寸

留言本参数

界面尺寸：

字体名：

    设置留言本所使用的字体，如果客户端没有所设置的字体，则会使用默认字体。

字体大小：

    设置留言本的字体大小，推荐包含CSS单位（pt:磅, px:象素等，请参考相关CSS文献）。

行间距：

    设置行间距，推荐120%～150%，也可用CSS单位。

留言本总宽度：

    留言本的总体宽度，单位：象素，也可用百分比。

窗格区块间距：

    签写留言、留言内容、管理员工具等窗格与上方的间距。单位：象素。

留言本左窗格宽度：

    留言内容左方显示访客、版主信息的窗口宽度。单位：象素，也可用百分比。

“写留言”文本框宽度：

    标题和联系方式等普通文本框的宽度，单位：字母宽度。

“验证码”文本框宽度：

    验证码输入框的宽度，单位：字母宽度。

“留言标题”文本宽度：

    “签写留言”页面留言标题输入框的宽度，单位：字母宽度。

“留言内容”文本宽度：

    “签写留言”页面留言框的宽度，单位：字母宽度。

“留言内容”文本高度：

    “签写留言”页面留言框的高度，单位：字母高度。

UBB 工具栏宽度：

    “签写留言”页面UBB工具栏宽度，UBB工具栏显示时有效。

UBB 工具栏高度：

    “签写留言”页面UBB工具栏高度，UBB工具栏显示时有效。

搜索框宽度：

    管理员和访客搜索界面中搜索框的宽度，单位：字母宽度。

“高级删除”中文本宽：

    “高级删除”页中文本框的宽度，单位：字母宽度。

“修改资料”中文本宽：

    “修改版主资料”中文本框的宽度，单位：字母高度。

“参数”中文本宽度：

     “留言本参数”中“基本配置”页的文本框宽度，单位：字母宽度。

“内容过滤”中文本宽：

    “内容过滤策略”页的文本框宽度，单位：字母宽度。

回复、公告编辑框宽度：

    版主回复、发布公告框的宽度，单位：字母宽度。

回复、公告编辑框高度：

    版主回复、发布公告框的高度，单位：字母高度。

每页显示的留言数：

    切换到留言本模式时，留言本首页、搜索结果、管理首页、管理员搜索结果页每页显示的留言条数。

每页显示的标题数：

    切换到论坛模式时，留言本首页、搜索结果、管理首页、管理员搜索结果页每页显示的留言条数。

头像每行显示的数目：

    “签写留言”和“修改版主资料”页每行显示多少个头像。

少量显示的头像数：

    “签写留言”和“修改版主资料”页少量显示的头像数，单击“更多头像”才显示全部头像。


留言本参数 功能设置

留言本参数

功能设置：

回复内容显示位置：

    选择“内嵌于访客留言”，回复将以小方块的形式嵌于留言末尾；选择“显示在访客留言下方”，回复将作为单独的窗口显示在留言下方。使用内嵌方式时，不会显示版主资料中的昵称和头像。

隐藏内容被隐藏的留言：

    设置是否为访客显示被管理员设为“内容隐藏”且未回复的留言。

隐藏待审核留言：

    设置是否为访客显示等待审核的留言。如访客留言后因该选项而不能显示所写留言，将在页面顶部给出提示。

隐藏版主未回复悄悄话：

    设置是否为访客显示尚未被版主回复的悄悄话。如访客留言后因该选项而不能显示所写留言，将在页面顶部给出提示。

Logo显示模式：

    如选择“横幅模式”，Logo将占据整行，网站标题显示在下方；如选择“图片模式”，Logo和网站标题在一行显示。

分页窗口显示位置：

    可设置留言分页窗口显示在留言页面的上方、下方或上下方。

访客搜索窗口显示位置：

    可设置访客搜索窗口显示在留言页面的上方、下方或上下方。

分页列表模式：

    区段式：分页窗口中只显示少量页号，通过翻页按钮实现页号转移；
    平面式：所有页号均列于分页窗口中，页号较多时会使分页窗口变得更长。

区段式分页项数：

    在使用区段式分页列表时，可通过此项来设置最多可显示的页号数目。

UBB工具栏：

    设置是否显示UBB工具栏，如果没有对应的UBB权限，即使开启也不会显示。

UBB开关(须启用UBB)：

    设置各项UBB子功能的细化开关。

留言本对齐方式：

    设置留言本在整个浏览器窗口中的对齐方式，可以选择左对齐、居中或右对齐。

留言本边框线：

    设置是否显示留言本最外层的边框线。

留言本标题栏：

    设置是否显示留言本最上方的标题栏，其中可以通过“基本设置”页设置网站的相关内容。

网页右键菜单：

    设置当用户单击鼠标右键时，是否显示快捷菜单。

选择网页内容：

    设置当鼠标在文字上拖动时，是否允许选择文字。

复制网页(Ctrl-C)：

    设置是否允许用户通过快捷键Ctrl-C或菜单的复制命令将内容复制到剪贴板。

被IFrame内嵌：

    设置是否允许被框架或内嵌框架包含，如果不允许，页面将自动跳至整个浏览器窗口。

留言字数限制：

    设置最大留言字数，回车换行占2字，并且按UBB编码前统计。达到最大字数后继续输入，将得到“已达最大字数限制”的提示。如果客户端关闭JavaScript功能执意提交过多的文字，超出部分将被服务器端程序截断。

留言通过审核前提示：

    设置是否在留言通过审核前给出确认提示。

删除留言时提示：

    设置是否在删除留言前给出确认提示。

删除回复时提示：

    设置是否在删除回复前给出确认提示。

删除选定留言时提示：

    设置是否在删除选定留言前给出确认提示。

执行高级删除时提示：

    设置是否在执行“高级删除”前给出确认提示。

留言本配色方案：

    留言本有多种配色方案供选择，可以根据需要选择与网站接近的风格。


IP屏蔽策略

    部分扰乱留言本秩序的访客可以使用IP屏蔽策略屏蔽，或者留言本需要保密，特定IP的人员才可访问，亦可使用屏蔽策略，对IP固定的用户特别有效。
    在管理界面最上方的“管理员工具”中点击“IP屏蔽策略”进入IP屏蔽策略设置页面。

IP屏蔽的三种策略：

不使用IP屏蔽策略：

    此时任何浏览者都可以看到留言本的内容、进行留言、搜索等操作，只要相关的状态或权限开启即可。

只屏蔽特定的IP段，其余放行：

    对指定的IP段进行屏蔽，如果特定IP在屏蔽段列表中，其访问将被禁止。

只允许特定的IP段，其余均不放行：

    只放行特定的IP。特定IP只有在允许段列表中，才有权限进行访问，只要相关的状态或权限开启即可。

添加IP段：

    使用第二或第三种IP屏蔽策略时，需要输入指定的IP段。输入格式为：起始IP-终止IP，例如192.168.0.1-192.168.0.100，小的IP在前，大的IP在后，否则系统不会接受；IP范围可以跨网段；如果需要输入多个IP段，请分多行来写；只屏蔽一个IP时起始IP与终止IP相同。
    请严格按照IP格式来书写，否则系统可能不会接受。每一位的最小值为0，最大值为255（某些数字可能有特殊意义而无作用，但本留言本仍然作支持）。
    输入完成后单击“更新数据”添加新的IP段。

删除IP段：

    已保存的IP段会显示在添加框的下面，请根据需要选择要删除的IP段，单击“更新数据”完成删除。

参考图片：


内容过滤策略

    如果站长不希望出现无关或有害的信息，可以使用内容过滤策略，过滤掉敏感词语，或者直接拒绝留言。
    在管理界面最上方的“管理员工具”中点击“内容过滤策略”进入内容过滤策略设置页面。

添加新过滤策略：

查找内容：

    “查找内容”中输入您不想在留言中出现的字词，这里也可以使用正则表达式。关于正则表达式的使用方法请参考附录中微软的帮助说明。比如要屏蔽“网络赚钱”这几个字，但又担心他人在这几字之间安插一些符号干扰信息，这样不影响阅读，却逃避了过滤。此时就可以用正则表达式了，它是一种表述文字规律的语言，输入“网.*?络.*?赚.*?钱”，那么在这几字中间加入任何其它信息，都会被过滤策略所识别。
    如果查找的内容要区分大小写，请选中下方的“区分大小写”选项。
    如果要启用正则表达式的多行模式，请选择“正则多行模式”。

查找范围：

    根据指定的查找内容，检查哪些项目（标题、内容……），请根据实际情况勾选。

处理方式：

    处理方式指如果满足过滤条件（在相应范围内找到了查找的内容），采取的措施。
    选择“替换为下面的文本”，则将找到的内容替换为下方文本框中指定的内容，替换的内容可以为空。
    选择“等待审核”，则满足条件的留言变为待审核状态，管理员可在留言列表中通过审核，或者删除。此选项即使留言审核功能未启用也仍然有效。
    选择“拒绝留言”，则满足条件时访客留言不会成功，并显示错误消息。
    由于签写留言时，访客姓名和标题是不允许为空的，如果因为过滤策略的原因造成姓名或标题被替换为空，留言将不成功。

修改过滤策略：

    已添加的过滤策略将显示在下方，找到相应策略后，直接修改便可，方法和添加新策略相似。修改完成后单击“更新”保存。

移动过滤策略的次序：

    因为过滤策略涉及替换操作，对于一条留言，不同的顺序可能造成不同的替换次数或位置，可以根据实际情况移动策略的位置。每一条策略都有“移至顶层”、“移至底层”、“上移”、“下移”供操作。

删除过滤策略：

    在需要删除的策略上单击“删除”，完成该条过滤策略的删除。


防灌水策略

    防灌水策略用于尽可能防止访客发送无用或垃圾消息。它是IP屏蔽策略和内容过滤策略的补充。

从时间上防止灌水：

    通过设置“同一用户最小发言时间间隔”来限制用户发言频率，该项参数规定了某访客留言后，下次留言或回复他人留言需要等待的最短时间。单位：秒。如果不希望加以限制，设为0。

从内容上防止灌水：

    此项用于防止访客发送重复内容。搜索对象可以是新留言，也可以是访客回复，请按照需要勾选。
    搜索方式可以是“具有”，即内容与先前留言完全等同的判为灌水留言；或者“含有”，即内容为先前留言的子集（或真子集），则判为灌水。
    搜索字段可以选择标题和留言内容两项。
    设置“最新n条留言”，确定搜索范围是最近的n条留言，置为0则本条策略不奏效。


留言管理

查看/搜索留言：

    登录管理界面后，默认首页显示了最新的留言。可以单击页面最下方的页号查看不同页的留言。如果已进入其它页，可在管理界面最上方的“管理员工具”中点击“管理首页”。
    要搜索留言，请单击“管理员工具”中的“搜索留言”，支持模糊搜索，“%”可以表示任意多个字符（可以是0个），“_”表示任意一个字符。根据具体情况选择不同的搜索项目。

通过审核：

    如果在留言本参数中启用了留言审核， 则访客留言后会在该条留言上出现“通过审核”的选项，管理员可以单击“通过审核”使留言真正显示。
    “留言通过审核前提示”决定了操作前是否显示确认对话框。

编辑留言：

    管理员可以编辑访客留言的标题、内容，以修改访客留言中存在的错误，或者仅为删去不便于公开的内容。

公开悄悄话：

    管理员可以将没有必要保密的悄悄话留言公开。

隐藏/显示联系方式：

    管理员可以将访客联系方式在显示/隐藏之间切换。

隐藏/显示留言内容：

    管理员可以将访客留言内容在显示/隐藏之间切换，以使重要留言内容得到保护。

回复留言：

    在访客留言上单击“回复”，便可在回复页面中输入回复文字，单击“发表回复”保存。
    若需要修改回复，只需再次单击“回复”，原先的回复内容在文本框中供编辑。
    如果留言尚未通过审核，回复命令变为“通过审核并回复”。

删除留言：

    在需要删除的留言上点击“删除”即可，如果留言有回复，会被同时删除。
    “删除留言时提示”决定了操作前是否显示确认对话框。

一次删除多条留言：

    在需要删除的留言左下角选择“(选定)”项，然后在留言列表的上方或下方点击“删除选定留言”即可。
    “删除选定留言时提示”决定了操作前是否显示确认对话框。

删除回复：

    在需要删除回复的留言上点击“删除回复”即可，删除回复后并不影响原先的留言。
    “删除回复时提示”决定了操作前是否显示确认对话框。

置顶留言：

    执行“置顶留言”后，当前操作的留言被提前到留言本的最前端，并一直保持在最前的位置。

提前留言：

    执行“提前留言”后，当前操作的留言被提前到普通留言之前、置顶留言之后，之后如果添加新留言，该条留言仍会被下移。

锁定回复：

    仅“访客回复”开启时有效，回复被锁定后访客不能回复留言。

悄悄话提示：

    如果访客留言使用了悄悄话选项，那么该留言只有管理员可见，留言下方有提示图标出现（如下图），前提是打开了悄悄话功能。

邮件通知提示：

    当访客要求“回复后用邮件通知”时，留言下方将出现“邮件通知”的提示。


高级删除

    高级删除可以根据一定的条件批量删除留言，至于执行前是否出现确认提示，取决于“执行高级删除时提示”。
    请在管理界面最上方的“管理员工具”中点击“高级删除”。

删除指定时间前的留言：

    删除特定时间及该时间前的留言，如果只输入日期而省略时间，则时间默认为0:0:0。

删除指定时间后的留言：

    删除特定时间及该时间后的留言，如果只输入日期而省略时间，则时间默认为0:0:0。

删除最靠前(最老)的n条留言：

    删除留言本中最早的n条留言。

删除最靠后(最新)的n条留言：

    删除留言本中最新的n条留言。

删除姓名/标题/留言正文中包含特定字符串的留言：

    删除姓名/标题/留言正文中包含特定字符串的留言，“%”可以表示任意多个字符（可以是0个），“_”表示任意一个字符。


发布置顶公告

    置顶公告将显示在留言本首页、访客搜索结果页和管理界面首页。由于置顶公告放在非常显眼的位置，来访者阅读的几率非常高，这对站长发布重要公告十分有用。
    点击管理界面最上方的“发布置顶公告”，进入公告编辑框。这里，您可以使用HTML或UBB特效，勾选下方对应的选项以获支持。如果已经发布过置顶公告，原先的公告内容会出现在编辑框中供修改。
    如果要删除公告，只需清空编辑框，单击“更新数据”即可。


修改版主资料

    版主资料将体现在留言回复中，包括昵称、联系方式和头像。修改这些信息会同步更新已回复留言的版主资料，但不会影响回复时间。
    在管理界面最上方的“管理员工具”中点击“修改版主资料”，各项数据都可以方便地修改，单击下方的“更多头像”还可以列出全部可用的头像。


查看访问统计

    访问统计帮助站长了解留言本的访问情况，起到辅助决策的作用。在管理页面最上方的“管理员工具”中点击“访问统计”，进行统计数据的查看。
    “留言页面”组统计访客查看留言的次数和频率。
    “搜索页面”组统计搜索次数和频率，如果搜索次数突然偏高，站长应该引起注意，很可能是有人在尝试搜索功能是否有漏洞（比如SQL注入）。
    “‘签写留言’页面”组统计留言的流失情况，通过页面访问次数和实际留言次数对比，可以得出有多少人放弃了留言，“被过滤次数”和“被拒绝次数”是指被内容过滤策略过滤或拒绝的 留言数。
    “‘管理员登录’页面”组记录了管理员的登录次数和登录失败次数，如果登录失败次数比想象的高得多，站长需引起注意，必要时更改登录密码。
    “客户端操作系统”统计用户使用各操作系统的概率。
    “客户端浏览器”统计用户使用各浏览器的概率。
    “客户端屏幕分辨率”统计用户使用各屏幕分辨率的概率。
    “访问时段”统计用户各时段的访问概率。
    “访问来源”统计用户通过哪些站点的链接，访问此留言本。


压缩数据库

    数据库进行不断地添加和删除数据后，会像磁盘一样内部产生碎片，以及不使用但未释放的空间，此时可以执行管理界面最上方的“压缩数据库”命令，请稍等直到出现“数据库压缩完成”的提示。

Access数据库用户注意：

    如果您的服务器的FSO组件被屏蔽，压缩是无法进行的，并给出错误提示。FSO组件是把双刃剑，容易被黑客利用，有的服务商可能屏蔽了它。如果是这样，您还是可以把数据库下载回来，在本地压缩。方法是用Microsoft Access打开，选择“工具”→“数据库实用工具”→“压缩和修复数据库”即可。

SQL Server数据库用户注意：

    使用此功能不但会清理数据库文件，还会截断日志。


首页调用说明

    所谓首页调用，即在首页特定位置显示出最新的n条留言标题。

两种页面输出方式：

iframe方式：

    留言标题显示在内嵌框架中，字体样式、背景及配色，都与留言本保持一致。

JavaScript方式：

    留言标题文字直接在当前页面输出，字体样式及背景，取决于当前页面。如果用户浏览器关闭了JavaScript脚本功能，则文字无法输出。

iframe方式使用方法：

    在网页代码中插入以下代码：

<iframe width="宽度" height="高度" src="http://留言本位置/tlist.asp?n=显示条数" frameborder="0"></iframe>

JavaScript方式使用方法：

    在网页代码中插入以下代码：

<script language="javascript" src="http://留言本位置/tlist.asp?n=显示条数&js=yes"></script>

目标窗口：

    当用户点击“查看留言”时，iframe方式默认在包含它的页面窗口中打开，而JavaScript方式则在页面自身的窗口打开。如果您希望在新窗口中打开，请使用参数target=_blank， 两种方式都适用。例如：

<script language="javascript" src="http://留言本位置/tlist.asp?n=显示条数&js=yes&target=_blank"></script>

标题前缀：

    如果需要在首页调用标题前加固定的前缀，请使用参数prefix=前缀符号， 两种方式都适用。例如：

<script language="javascript" src="http://留言本位置/tlist.asp?n=显示条数&js=yes&prefix=-"></script>

不使用换行符：

    如果您不需要在标题间输出断行符号（<br/>），而改用页面CSS来控制换行，则只需设置nobr=yes即可，例如：

<script language="javascript" src="http://留言本位置/tlist.asp?n=显示条数&js=yes&nobr=yes"></script>

限制字数：

    若想限制标题最大字数，请使用参数len=最大字数，例如：

<script language="javascript" src="http://留言本位置/tlist.asp?n=显示条数&js=yes&len=20"></script>

可使用相对路径：

    如果网站首页和留言本在相同的域名目录中，也可使用相对路径引用tlist.asp。

不显示的留言标题的例外情况：

    有几种情况的留言标题不会出现在首页调用中：待审核的留言和悄悄话。如果留言本状态为关闭，或者访问者当前IP属于屏蔽范围，同样不会显示。


留言功能说明

进入“签写留言”页面：

    在留言本首页或留言搜索结果页面，其上端和下端都有“签写留言”的链接，点击即可进入“签写留言”页面。

输入验证码：

    如果版主开启了验证码功能，只有输入正确的验证码，系统才会接受提交的留言。

填写称呼：

    称呼为必填项，如果不输入称呼，将无法留言。

填写留言标题与内容：

    留言标题与内容为留言的主体部分，其中标题为必填项，如果内容为空，留言后内容区域将显示“(无内容)”。

悄悄话选项：

    当管理员开启悄悄话功能时，留言界面出现“悄悄话”的选项。选中该项，他人不能看到留言内容。如果管理员还开启了加密悄悄话功能， 界面上还会出现“加密悄悄话”的选项，选中该项，并在下方输入密码，将为悄悄话加密。留言完成（并通过审核）后，访客可以凭密码查看原先的留言和回复。如果悄悄话不设密码，版主回复将公开显示。

填写联系方式：

    联系方式包括邮件地址、QQ号码、MSN帐号或主页地址。这些是选填项，如果填写，并且非悄悄话，那么这些信息将出现在留言左方的访客信息中。

隐藏联系方式：

     联系方式包括邮件、QQ、MSN、主页，选择“联系方式仅版主可见”，则对普通访客隐藏。管理员登陆后仍然可以看到留言者的联系方式，并且可以公开/隐藏留言者的联系方式。

预览留言：

     点击“预览留言”可以查看留言的实际显示效果，即HTML和UBB实际转换后的效果。

可能需要待审核：

    如果版主开启了留言需审核功能，那么在留言真正显示前，需要等待版主审核。


高级调整与维护指南

更改界面：

自定义留言本的外观。

管理员使用自定义头像：

管理员使用特别的头像，而普通用户无法使用。

框架内无法显示验证码的原理及补救措施：

某些情况下把留言本嵌于框架中可能不能正常显示验证码。

隐藏登录界面：

不允许他人尝试登录。

使用Access97数据库：

使用Access97数据库以节约磁盘空间。

自定义头像和表情：

自定义头像和表情。

常见问题或错误：

使用ASP时可能经常遇到的错误。


更改界面

使用自定义配色方案：

    可以使用附件中的管理工具进行配色方案的编辑，所有的修改都会存入数据库中。

更改界面元素布局：

    如果您更改界面布局，会有一定的风险，所以在修改完成后应作一下完备的测试。如果修改仅牵涉HTML元素，成功的可能性更大一些，否则，您必须读懂VBScript服务器端代码，或者在相关人员的指导下进行修改工作。


框架内无法显示验证码的原理及补救措施

概述：

    目前已知一种无法显示验证码的情况，必须同时满足：
(1)将留言本放在框架（或内嵌框架）中；
(2)主框架页面和留言本ASP页面不在同一服务器上；
(3)客户端浏览器使用IE 6.0版或更高。

    但是，如果浏览器单独浏览ASP服务器上的页面，然后转到框架中，验证码又显示正常。

原因：

    服务器为了确认用户，每个来访线程都有一个唯一的编号，就像身份证号码一样，被称为SessionID，如果访问该服务器时还没有SessionID，就会被创建，之后IE发送数据给服务器时，都会同时传送SessionID。这就是为什么进入管理界面，不用每访问一个页面都要输入密码。而IE6可能出于安全方面的考虑，如果主框架与框架内的页面不在同一服务器时，不会在访问框架内页面时发送SessionID，以至ASP服务器认为是一个新的来访者，并分配新的SessionID。这样，验证码显示模块读取的Session和页面Session并非同一Session，且新的Session尚未分配验证码，因此无法显示。
    然而，如果事先用IE整个窗口去浏览ASP服务器页面，那么它会认为该服务器是安全的，回到框架中时，会发送正确的SessionID。

参考解决方案：

     既然只要IE整窗口中访问过ASP页面就正常，那么就让网站首页去ASP服务器页面“溜达一趟”，假设非留言本服务器首页为index.htm，现在把它改成index2.htm，重新创建一个index.htm并在其中写：
<html><head><meta http-equiv="refresh" content="0;url=http://asp服务器地址/某一目录/jump.asp"></head><body></body></html>
当然，如果你用的是index.asp，也可以这么写：
<%Response.Redirect "http://asp服务器地址/某一目录/jump.asp"%>

    这个jump.asp就是负责跳回原页面的文件，在其中写：
<%Response.Redirect "http://主服务器地址/index2.htm"%>


隐藏登录界面

    部分站长出于安全考虑，可能希望隐藏登录界面。如果您希望如此，请完成下面三个步骤，缺一不可。

去除登录管理超链接：

    以下页面含有登录管理的超链接，请去除或注释掉链接代码：
func_guest.inc
err.asp

为登录页面改名：

    默认登录页面为admin_login.asp，您可以起一个不容易被猜到的名字。

更改数据提交方向：

    光为登录页面改名是没用的，因为登录数据要提交到login_verify.asp验证，也就是说，登录页面只是一个“外壳”，真正负责身份验证的为提交数据的目标页面。如果他人从外部直接提交数据到login_verify.asp，仍能尝试登录。
    为login_verify改名后，同时还要修改“外壳”页面的数据提交方向。找到<form method="post" action="login_verify.asp" ...>这行代码，将action属性修改为实际处理提交数据的页面，即login_verify.asp改名后的页面。

为什么不对外部提交的数据进行限制？

    判断数据是否从外部提交，实际上还是提取HTTP头中的信息，然后和本地服务器地址作比较。然而，某些防火墙是会过滤这部分信息的，这使得判断变得不可靠。更为重要的是，HTTP头是可以伪造的，这方面的工具也不少。这样，对外部提交的数据进行限制，只可能造成合法用户登录不了，非法用户从“后门”进入的局面，是一项非常不可靠的判断方式。


使用Access97数据库

    本留言本默认使用Access2000数据库。使用Access97数据库，文件最大能减小到原来的一半。不过有些服务器对Access97的支持度可能不好，如果您确信您的服务器对Access97的支持度没有问题，且非常在意文件大小，那么可将数据库转换成Access97格式。

数据库转换为Access97格式：

    请用Microsoft Access 2000或更高版本打开数据库，选择“工具”→“数据库实用工具”→“转换数据库”→“转为Access97文件格式”，并另起名保存。
    删除原Access2000格式数据库，将新数据库名改回原数据库文件名。

修改数据库格式标志：

    打开config.asp文件，将dbtype一项设置为1，即Access97数据库。

    最后在服务器上更新数据库和config.asp文件即可。


自定义头像和表情

    头像指访问者留言时可选择使用的脸形图片；表情是在留言中可插入的能表达心情的小图片。

所在目录：

    默认情况下，头像文件在“face”目录下，表情文件在“smallface”目录下。如需修改目录名称，请打开config.asp，修改“FacePath”和“SmallFacePath”两项的值，它们分别对应头像目录和表情目录。

文件命名规则：

    头像和表情的主文件名皆为自然数编号，从1开始，中间不可跳开，扩展名固定为.gif，如果您使用非gif图像，请强制更改扩展名为.gif。

设置头像和表情数量：

    如果您调整后的头像或表情数量与初始数量不符，请分别调整config.asp中的“FaceCount”和“SmallFaceCount”两项设置。


常见问题或错误

访问时出现登录框，要求输入用户名和密码：

检查NTFS Web目录的访问权限：

    如果Web目录为NTFS文件格式，请确保“IUSR_计算机名”这个用户对Web目录有“读取及运行”权限。该用户是在安装IIS时产生的，所有基于Internet的访问都由该用户代理。如果Web目录尚未分配该用户权限，可以在IIS管理器中运行权限向导，也可以按下面的方法修改：
    在Web根目录上单击右键，选择“属性”，在“安全”页单击“添加”，找到“IUSR_计算机名”用户，添加并确定。回到属性窗口，在该用户的权限列表中选择“读取及运行”（如下图）。

    Windows XP用户注意，如果界面中没有显示“安全”页，请检查以下两个设置：
    1、如果登陆时使用欢迎屏幕，则一般情况下隐藏了Administrator用户，普通用户很可能没有相应的权限，此时您将看不到“安全”页，请以具有管理员权限的帐号重新登陆。
    2、请在“文件夹选项”→“查看”中，取消“使用简单文件共享”的选择。

检查本地安全策略的用户访问权限：

    在“管理工具”的“本地安全策略中”，找到“本地策略”→“用户权利指派”，其中“从网络访问此计算机”的策略中应包含“IUSR_计算机名”这个帐号，而“拒绝从网络访问这台计算机”中应不包含“IUSR_计算机名”这个帐号。

错误 80004005 操作必须使用一个可更新的查询：
错误 80040E09 不能更新。数据库或对象为只读：

     可能是由于没有开启NTFS对数据库文件的写权限。在数据库文件所属目录上单击右键，选择“属性”，找到“IUSR_计算机名”用户（如果没有请添加），并赋予“读取及运行”、“写入”权限。

错误 8007007f 找不到指定的程序：

    可能服务器使用了Windows Server 2003系统，或者在同一硬盘的同一分区上安装了不同版本的NT系统，且都架设了IIS服务器。可以尝试安装MDAC 2.7，若不见效，再安装MDAC 2.8，若仍不见效，请按如下方法处理：
(1)运行MDAC 2.8安装程序：mdac28_typ.exe /c /t:c:\mdac ，将文件解压到C:\mdac下。
(2)打开C:\mdac\mdacxpak.cab，将全部以“odbc”和“oledb”开头的文件复制到System32和System32\DLLCache目录下，如果文件被使用而无法覆盖，请忽略。如果出现文件保护错误而要求插入安装光盘，请取消。
(3)重新启动计算机后，运行 regsvr32.exe oledb32.dll

MDAC 2.7 下载地址：
http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=9ad000f2-cae7-493d-b0f3-ae36c570ade8

MDAC 2.8 下载地址：
http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=6c050fe3-c795-4b7d-b037-185d0506396c

错误 8002801d 库没有注册：
错误 800a03f6 错误的数量词：

    在处理正则表达式对象时出错，请将Windows Script版本升级到5.6，可通过Windows Update升级，也可从微软网站下载。


UBB使用说明

功能 | 格式 | 分组
图片 | [img]图片地址[/img] [img=宽,高]图片地址[/img] | 图片
超链接 | [url]资源地址[/url] [url=资源地址]链接文字[/url] | URL、Email
电子邮件链接 | [email]邮件地址[/email] | URL、Email
自动识别网址 | 输入网址后自动变为超链接 | 自动识别网址
Flash | [flash]Flash地址[/flash] [flash=宽,高]Flash地址[/flash] | 播放控件
Windows Media Player | [mp]媒体文件地址[/mp] [mp=宽,高]媒体文件地址[/mp] | 播放控件
Real Player | [rm]媒体文件地址[/rm] [rm=宽,高]媒体文件地址[/rm] | 播放控件
引用（缩进） | [quote]引用文字[/quote] | 段落样式
无序列表 | [li]列表项[/li] | 段落样式
指定字体 | [font=字体名]文字[/font] | 字体样式
粗体字 | [b]粗体文字[/b] | 字体样式
斜体字 | [i]斜体文字[/i] | 字体样式
下划线 | [u]加下划线的文字[/u] | 字体样式
删除线 | [strike]加删除线的文字[/strike] | 字体样式
文字颜色 | [color=颜色]应用颜色的文字[/color] | 字体颜色
文字背景色 | [bgcolor=颜色]含背景色的文字[/bgcolor] | 字体颜色
指定对齐方式 | [align=方式(left,center,right)]应用于对齐的文字[/align] | 对齐方式
居中对齐 | [center]应用于居中对齐的文字[/center] | 对齐方式
来回滚动的文字 | [fly]滚动文字[/fly] | 移动效果
向左滚动的文字 | [move]滚动文字[/move] | 移动效果
背景发光效果 | [glow=背景发光宽度,颜色,强度]文字[/glow] | 滤镜效果
背景阴影效果 | [shadow=背景阴影宽度,颜色,强度]文字[/shadow] | 滤镜效果
表情图标 | [faceX] （X为表情编号） | 表情图标


正则表达式简介

这些页包含的信息其目的是提供一个关于正则表达式的通用介绍。

尽管试图让每个主题的内容都比较独立，但这些主题所包含的大部分信息都依赖于对前面所介绍的特性或概念的理解。因此，建议您顺序地仔细阅读这些主题，以便最全面地了解这些材料。

“正则表达式简介”包括下述各个主题：

正则表达式

早期起源

使用正则表达式

正则表达式语法

建立正则表达式

优先权顺序

普通字符

特殊字符

非打印字符

字符匹配

限定符

定位符

选择与编组

后向引用

© 2000 Microsoft Corporation 版权所有。保留所有权利。使用规定。


正则表达式简介 正则表达式

正则表达式

如果原来没有使用过正则表达式，那么可能对这个术语和概念会不太熟悉。不过，它们并不是您想象的那么新奇。

请回想一下在硬盘上是如何查找文件的。您肯定会使用 ? 和 * 字符来帮助查找您正寻找的文件。? 字符匹配文件名中的单个字符，而 * 则匹配一个或多个字符。一个如 'data?.dat' 的模式可以找到下述文件：

data1.dat

data2.dat

datax.dat

dataN.dat

如果使用 * 字符代替 ? 字符，则将扩大找到的文件数量。'data*.dat' 可以匹配下述所有文件名：

data.dat

data1.dat

data2.dat

data12.dat

datax.dat

dataXYZ.dat

尽管这种搜索文件的方法肯定很有用，但也十分有限。? 和 * 通配符的有限能力可以使你对正则表达式能做什么有一个概念，不过正则表达式的功能更强大，也更灵活。

© 2000 Microsoft Corporation 版权所有。保留所有权利。使用规定。


正则表达式简介 早期起源

早期起源

正则表达式的“祖先”可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。

1956 年, 一位叫 Stephen Kleene 的美国数学家在 McCulloch 和 Pitts 早期工作的基础上，发表了一篇标题为“神经网事件的表示法”的论文，引入了正则表达式的概念。正则表达式就是用来描述他称为“正则集的代数”的表达式，因此采用“正则表达式”这个术语。

随后，发现可以将这一工作应用于使用Ken Thompson 的计算搜索算法的一些早期研究，Ken Thompson是Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的qed 编辑器。

如他们所说，剩下的就是众所周知的历史了。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分。

© 2000 Microsoft Corporation 版权所有。保留所有权利。使用规定。


正则表达式简介 使用正则表达式

使用正则表达式

在典型的搜索和替换操作中，必须提供要查找的确切文字。这种技术对于静态文本中的简单搜索和替换任务可能足够了，但是由于它缺乏灵活性，因此在搜索动态文本时就有困难了，甚至是不可能的。

使用正则表达式，就可以：

  • 测试字符串的某个模式。例如，可以对一个输入字符串进行测试，看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。
  • 替换文本。可以在文档中使用一个正则表达式来标识特定文字，然后可以全部将其删除，或者替换为别的文字。
  • 根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。

例如，如果需要搜索整个 web 站点来删除某些过时的材料并替换某些HTML 格式化标记，则可以使用正则表达式对每个文件进行测试，看在该文件中是否存在所要查找的材料或 HTML 格式化标记。用这个方法，就可以将受影响的文件范围缩小到包含要删除或更改的材料的那些文件。然后可以使用正则表达式来删除过时的材料，最后，可以再次使用正则表达式来查找并替换那些需要替换的标记。

另一个说明正则表达式非常有用的示例是一种其字符串处理能力还不为人所知的语言。VBScript 是 Visual Basic 的一个子集，具有丰富的字符串处理功能。与 C 类似的 Visual Basic Scripting Edition 则没有这一能力。正则表达式给 Visual Basic Scripting Edition 的字符串处理能力带来了明显改善。不过，可能还是在 VBScript 中使用正则表达式的效率更高，它允许在单个表达式中执行多个字符串操作。

© 2000 Microsoft Corporation 版权所有。保留所有权利。使用规定。


正则表达式简介 正则表达式语法

正则表达式语法

一个正则表达式就是由普通字符（例如字符 a 到 z）以及特殊字符（称为元字符）组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板，将某个字符模式与所搜索的字符串进行匹配。

这里有一些可能会遇到的正则表达式示例：

Visual Basic Scripting Edition | VBScript | 匹配
/^\[ \t]*$/ | "^\[ \t]*$" | 匹配一个空白行。
/\d{2}-\d{5}/ | "\d{2}-\d{5}" | 验证一个ID 号码是否由一个2位数字，一个连字符以及一个5位数字组成。
/<(.*)>.*<\/\1>/ | "<(.*)>.*<\/\1>" | 匹配一个 HTML 标记。

下表是元字符及其在正则表达式上下文中的行为的一个完整列表：

字符 | 描述
\ | 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 后向引用、或一个八进制转义符。例如，'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。
^ | 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性，^ 也匹配 '\n' 或 '\r' 之后的位置。
$ | 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性，$ 也匹配 '\n' 或 '\r' 之前的位置。
* | 匹配前面的子表达式零次或多次。例如，zo* 能匹配 "z" 以及 "zoo"。 * 等价于{0,}。
+ | 匹配前面的子表达式一次或多次。例如，'zo+' 能匹配 "zo" 以及 "zoo"，但不能匹配 "z"。+ 等价于 {1,}。
? | 匹配前面的子表达式零次或一次。例如，"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。
{n} | n 是一个非负整数。匹配确定的 n 次。例如，'o{2}' 不能匹配 "Bob" 中的 'o'，但是能匹配 "food" 中的两个 o。
{n,} | n 是一个非负整数。至少匹配n 次。例如，'o{2,}' 不能匹配 "Bob" 中的 'o'，但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m} | m 和 n 均为非负整数，其中n <= m。最少匹配 n 次且最多匹配 m 次。刘， "o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
? | 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时，匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串，而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如，对于字符串 "oooo"，'o+?' 将匹配单个 "o"，而 'o+' 将匹配所有 'o'。
. | 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符，请使用象 '[.\n]' 的模式。
(pattern) | 匹配pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到，在VBScript 中使用 SubMatches 集合，在Visual Basic Scripting Edition 中则使用 $0…$9 属性。要匹配圆括号字符，请使用 '\(' 或 '\)'。
(?:pattern) | 匹配 pattern 但不获取匹配结果，也就是说这是一个非获取匹配，不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如， 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。
(?=pattern) | 正向预查，在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如， 'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ，但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始。
(?!pattern) | 负向预查，在任何不匹配Negative lookahead matches the search string at any point where a string not matching pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows"，但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始
x|y | 匹配 x 或 y。例如，'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。
[xyz] | 字符集合。匹配所包含的任意一个字符。例如， '[abc]' 可以匹配 "plain" 中的 'a'。
[^xyz] | 负值字符集合。匹配未包含的任意字符。例如， '[^abc]' 可以匹配 "plain" 中的'p'。
[a-z] | 字符范围。匹配指定范围内的任意字符。例如，'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。
[^a-z] | 负值字符范围。匹配任何不在指定范围内的任意字符。例如，'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。
\b | 匹配一个单词边界，也就是指单词和空格间的位置。例如， 'er\b' 可以匹配"never" 中的 'er'，但不能匹配 "verb" 中的 'er'。
\B | 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er'，但不能匹配 "never" 中的 'er'。
\cx | 匹配由x指明的控制字符。例如， \cM 匹配一个 Control-M 或回车符。 x 的值必须为 A-Z 或 a-z 之一。否则，将 c 视为一个原义的 'c' 字符。
\d | 匹配一个数字字符。等价于 [0-9]。
\D | 匹配一个非数字字符。等价于 [^0-9]。
\f | 匹配一个换页符。等价于 \x0c 和 \cL。
\n | 匹配一个换行符。等价于 \x0a 和 \cJ。
\r | 匹配一个回车符。等价于 \x0d 和 \cM。
\s | 匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t | 匹配一个制表符。等价于 \x09 和 \cI。
\v | 匹配一个垂直制表符。等价于 \x0b 和 \cK。
\w | 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
\W | 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。
\xn | 匹配 n，其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如， '\x41' 匹配 "A"。'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。.
\num | 匹配 num，其中 num 是一个正整数。对所获取的匹配的引用。例如，'(.)\1' 匹配两个连续的相同字符。
\n | 标识一个八进制转义值或一个后向引用。如果 \n 之前至少 n 个获取的子表达式，则 n 为后向引用。否则，如果 n 为八进制数字 (0-7)，则 n 为一个八进制转义值。
\nm | 标识一个八进制转义值或一个后向引用。如果 \nm 之前至少有is preceded by at least nm 个获取得子表达式，则 nm 为后向引用。如果 \nm 之前至少有 n 个获取，则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足，若 n 和 m 均为八进制数字 (0-7)，则 \nm 将匹配八进制转义值 nm。
\nml | 如果 n 为八进制数字 (0-3)，且 m 和 l 均为八进制数字 (0-7)，则匹配八进制转义值 nml。
\un | 匹配 n，其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如， \u00A9 匹配版权符号 (?)。

© 2000 Microsoft Corporation 版权所有。保留所有权利。使用规定。


正则表达式简介 建立正则表达式

建立正则表达式

构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与操作符将小的表达式结合在一起来创建更大的表达式。

可以通过在一对分隔符之间放入表达式模式的各种组件来构造一个正则表达式。对 Visual Basic Scripting Edition 而言，分隔符为一对正斜杠 (/) 字符。例如：

/expression/
对 VBScript 而言，则采用一对引号 ("") 来确定正则表达式的边界。例如：

"expression"
在上面所示的两个示例中，正则表达式模式 (expression) 均存储在RegExp 对象的Pattern 属性中。

正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。

© 2000 Microsoft Corporation 版权所有。保留所有权利。使用规定。


正则表达式简介 优先权顺序

优先权顺序

在构造正则表达式之后，就可以象数学表达式一样来求值，也就是说，可以从左至右并按照一个优先权顺序来求值。

下表从最高优先级到最低优先级列出各种正则表达式操作符的优先权顺序：

操作符 | 描述
\ | 转义符
(), (?:), (?=), [] | 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} | 限定符
^, $, \anymetacharacter | 位置和顺序
| | “或”操作

© 2000 Microsoft Corporation 版权所有。保留所有权利。使用规定。


正则表达式简介 普通字符

普通字符

普通字符由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符，所有数字，所有标点符号以及一些符号。

最简单的正则表达式是一个单独的普通字符，可以匹配所搜索字符串中的该字符本身。例如，单字符模式 'A' 可以匹配所搜索字符串中任何位置出现的字母 'A'。这里有一些单字符正则表达式模式的示例：

/a/
/7/
/M/
等价的 VBScript 单字符正则表达式为：

"a"
"7"
"M"
可以将多个单字符组合在一起得到一个较大的表达式。例如，下面的 Visual Basic Scripting Edition 正则表达式不是别的，就是通过组合单字符表达式 'a'、'7'以及 'M' 所创建出来的一个表达式。

/a7M/
等价的 VBScript 表达式为：

"a7M"
请注意这里没有连接操作符。所需要做的就是将一个字符放在了另一个字符后面。

© 2000 Microsoft Corporation 版权所有。保留所有权利。使用规定。


正则表达式简介 特殊字符

特殊字符

有不少元字符在试图对其进行匹配时需要进行特殊的处理。要匹配这些特殊字符，必须首先将这些字符转义，也就是在前面使用一个反斜杠 (\)。下表给出了这些特殊字符及其含义：

特殊字符 | 说明
$ | 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性，则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身，请使用 \$。
( ) | 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符，请使用 \( 和 \)。
* | 匹配前面的子表达式零次或多次。要匹配 * 字符，请使用 \*。
+ | 匹配前面的子表达式一次或多次。要匹配 + 字符，请使用 \+。
. | 匹配除换行符 \n之外的任何单字符。要匹配 .，请使用 \。
[ | 标记一个中括号表达式的开始。要匹配 [，请使用 \[。
? | 匹配前面的子表达式零次或一次，或指明一个非贪婪限定符。要匹配 ? 字符，请使用 \?。
\ | 将下一个字符标记为或特殊字符、或原义字符、或后向引用、或八进制转义符。例如， 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\"，而 '\(' 则匹配 "("。
^ | 匹配输入字符串的开始位置，除非在方括号表达式中使用，此时它表示不接受该字符集合。要匹配 ^ 字符本身，请使用 \^。
{ | 标记限定符表达式的开始。要匹配 {，请使用 \{。
| | 指明两项之间的一个选择。要匹配 |，请使用 \|。

© 2000 Microsoft Corporation 版权所有。保留所有权利。使用规定。


正则表达式简介 非打印字符

非打印字符

有不少很有用的非打印字符，偶尔必须使用。下表显示了用来表示这些非打印字符的转义序列：

字符 | 含义
\cx | 匹配由x指明的控制字符。例如， \cM 匹配一个 Control-M 或回车符。 x 的值必须为 A-Z 或 a-z 之一。否则，将 c 视为一个原义的 'c' 字符。
\f | 匹配一个换页符。等价于 \x0c 和 \cL。
\n | 匹配一个换行符。等价于 \x0a 和 \cJ。
\r | 匹配一个回车符。等价于 \x0d 和 \cM。
\s | 匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t | 匹配一个制表符。等价于 \x09 和 \cI。
\v | 匹配一个垂直制表符。等价于 \x0b 和 \cK。

© 2000 Microsoft Corporation 版权所有。保留所有权利。使用规定。


正则表达式简介 字符匹配

字符匹配

句点 (.) 匹配一个字符串中任何单个的打印或非打印字符，除了换行符 (\n) 之外。下面的 Visual Basic Scripting Edition 正则表达式可以匹配 'aac'、'abc'、'acc'、'adc'如此等等，同样也可以匹配 'a1c'、'a2c'、a-c'以及 a#c'：

/a.c/
等价的 VBScript 正则表达式为：

"a.c"
如果试图匹配一个包含文件名的字符串，其中句点 (.) 是输入字符串的一部分，则可以在正则表达式中的句点前面加上一个反斜杠 (\) 字符来实现这一要求。举例来说，下面的 Visual Basic Scripting Edition 正则表达式就能匹配 'filename.ext'：

/filename\.ext/
对 VBScript 而言，等价的表达式如下所示：

"filename\.ext"
这些表达式仍然是相当有限的。它们只允许匹配任何单字符。很多情况下，对从列表中匹配特殊字符十分有用。例如，如果输入文字中包含用数字表示为Chapter 1, Chapter 2诸如此类的章节标题，你可能需要找到这些章节标题。

括号表达式
可以在一个方括号 ([ 和 ]) 中放入一个或多个单字符，来创建一个待匹配的列表。如果字符被放入括号中括起来，则该列表称为括号表达式。括号内和其他任何地方一样，普通字符代表其本身，也就是说，它们匹配输入文字中出现的一处自己。大多数特殊字符在位于括号表达式中时都将失去其含义。这里有一些例外：

  • ']' 字符如果不是第一项，则将结束一个列表。要在列表中匹配 ']' 字符，请将其放在第一项，紧跟在开始的 '[' 后面。
  • '\' 仍然作为转义符。要匹配 '\' 字符，请使用 '\\'。

括号表达式中所包含的字符只匹配该括号表达式在正则表达式中所处位置的一个单字符。下面的 Visual Basic Scripting Edition 正则表达式可以匹配 'Chapter 1'、'Chapter 2'、'Chapter 3'、'Chapter 4' 以及 'Chapter 5'：

/Chapter [12345]/
在 VBScript 中要匹配同样的章节标题，请使用下面的表达式：

"Chapter [12345]"
请注意单词 'Chapter' 及后面的空格与括号内的字符的位置关系是固定的。因此，括号表达式只用来指定满足紧跟在单词 'Chapter' 和一个空格之后的单字符位置的字符集合。这里是第九个字符位置。

如果希望使用范围而不是字符本身来表示待匹配的字符，则可以使用连字符将该范围的开始和结束字符分开。每个字符的字符值将决定其在一个范围内的相对顺序。下面的 Visual Basic Scripting Edition 正则表达式包含了一个等价于上面所示的括号列表的范围表达式。

/Chapter [1-5]/
VBScipt 中相同功能的表达式如下所示：

"Chapter [1-5]"
如果以这种方式指定范围，则开始和结束值都包括在该范围内。有一点特别需要注意的是，在 Unicode 排序中起始值一定要在结束值之前。

如果想在括号表达式中包括连字符，则必须使用下述方法之一：

使用反斜杠将其转义：
[\-]

将连字符放在括号列表的开始和结束位置。下面的表达式能匹配所有的小写字母和连字符：
[-a-z]
[a-z-]

创建一个范围，其中开始字符的值小于连字符，而结束字符的值等于或大于连字符。下面两个正则表达式都满足这一要求：
[!--]
[!-~]

同样，通过在列表开始处放置一个插入符(^)，就可以查找所有不在列表或范围中的字符。如果该插入符出现在列表的其他位置，则匹配其本身，没有任何特殊含义。下面的 Visual Basic Scripting Edition 正则表达式匹配章节号大于 5 的章节标题：

/Chapter [^12345]/
对 VBScript 则使用：

"Chapter [^12345]"
在上面所示的示例中，表达式将匹配第九个位置处除1, 2, 3, 4, or 5 之外的任何数字字符。因此， 'Chapter 7' 为一个匹配，同样 'Chapter 9' 也是如此。

上面的表达式可以使用连字符 (-) 表示。对 Visual Basic Scripting Edition 为：

/Chapter [^1-5]/
或者，对 VBScript 为：

"Chapter [^1-5]"
括号表达式的典型用法是指定对任何大写或小写字母字符或任何数字的匹配。下面的 Visual Basic Scripting Edition 表达式给出了这一匹配：

/[A-Za-z0-9]/
等价的 VBScript 表达式为：

"[A-Za-z0-9]"

© 2000 Microsoft Corporation 版权所有。保留所有权利。使用规定。


正则表达式简介 限定符

限定符

有时候不知道要匹配多少字符。为了能适应这种不确定性，正则表达式支持限定符的概念。这些限定符可以指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。

下表给出了各种限定符及其含义的说明：

字符 | 描述
* | 匹配前面的子表达式零次或多次。例如，zo* 能匹配 "z" 以及 "zoo"。 * 等价于{0,}。
+ | 匹配前面的子表达式一次或多次。例如，'zo+' 能匹配 "zo" 以及 "zoo"，但不能匹配 "z"。+ 等价于 {1,}。
? | 匹配前面的子表达式零次或一次。例如，"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。
{n} | n 是一个非负整数。匹配确定的 n 次。例如，'o{2}' 不能匹配 "Bob" 中的 'o'，但是能匹配 "food" 中的两个 o。
{n,} | n 是一个非负整数。至少匹配n 次。例如，'o{2,}' 不能匹配 "Bob" 中的 'o'，但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m} | m 和 n 均为非负整数，其中n <= m。最少匹配 n 次且最多匹配 m 次。刘， "o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

© 2000 Microsoft Corporation 版权所有。保留所有权利。使用规定。


正则表达式简介 定位符

定位符

到现在为止，所看到的示例都只考虑查找任何地方出现的章节标题。出现的任何一个字符串 'Chapter' 后跟一个空格和一个数字可能是一个真正的章节标题，也可能是对其他章节的交叉引用。由于真正的章节标题总是出现在一行的开始，因此需要设计一个方法只查找标题而不查找交叉引用。

定位符提供了这个功能。定位符可以将一个正则表达式固定在一行的开始或结束。也可以创建只在单词内或只在单词的开始或结尾处出现的正则表达式。下表包含了正则表达式及其含义的列表：

字符 | 描述
^ | 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性，^ 也匹配 '\n' 或 '\r' 之后的位置。
$ | 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性，$ 也匹配 '\n' 或 '\r' 之前的位置。
\b | 匹配一个单词边界，也就是指单词和空格间的位置。
\B | 匹配非单词边界。

不能对定位符使用限定符。因为在一个换行符或者单词边界的前面或后面不会有连续多个位置，因此诸如 '^*' 的表达式是不允许的。

要匹配一行文字开始位置的文字，请在正则表达式的开始处使用 '^' 字符。不要把 '^' 的这个语法与其在括号表达式中的语法弄混。它们的语法根本不同。

要匹配一行文字结束位置的文字，请在正则表达式的结束处使用 '$' 字符。

要在查找章节标题时使用定位符，下面的 Visual Basic Scripting Edition 正则表达式将匹配位于一行的开始处最多有两个数字的章节标题：

/^Chapter [1-9][0-9]{0,1}/

VBScript 中相同功能的正则表达式如下：

"^Chapter [1-9][0-9]{0,1}"

一个真正的章节标题不仅出现在一行的开始，而且这一行中也仅有这一个内容，因此，它必然也位于一行的结束。下面的表达式确保所指定的匹配只匹配章节而不会匹配交叉引用。它是通过创建一个只匹配一行文字的开始和结束位置的正则表达式来实现的。

/^Chapter [1-9][0-9]{0,1}$/

对 VBScript 则使用：

"^Chapter [1-9][0-9]{0,1}$"

匹配单词边界有少许不同，但却给正则表达式增加了一个非常重要的功能。单词边界就是单词和空格之间的位置。非单词边界就是其他任何位置。下面的 Visual Basic Scripting Edition 表达式将匹配单词 'Chapter' 的前三个字符，因为它们出现在单词边界后：

/\bCha/

对 VBScript 为：

"\bCha"

这里 '\b' 操作符的位置很关键。如果它位于要匹配的字符串的开始，则将查找位于单词开头处的匹配；如果它位于改字符串的末尾，则查找位于单词结束处的匹配。例如，下面的表达式将匹配单词 'Chapter' 中的 'ter'，因为它出现在单词边界之前：

/ter\b/

以及

"ter\b"

下面的表达式将匹配 'apt'，因为它位于 'Chapter' 中间，但不会匹配 'aptitude' 中的'apt'：

/\Bapt/

以及

"\Bapt"

这是因为在单词 'Chapter' 中 'apt' 出现在非单词边界位置，而在单词 'aptitude' 中位于单词边界位置。非单词边界操作符的位置不重要，因为匹配与一个单词的开头或结尾无关。

© 2000 Microsoft Corporation 版权所有。保留所有权利。使用规定。


正则表达式简介 选择与编组

选择与编组

选择允许使用 '|' 字符来在两个或多个候选项中进行选择。通过扩展章节标题的正则表达式，可以将其扩充为不仅仅适用于章节标题的表达式。不过，这可没有想象的那么直接。在使用选择时，将匹配'|' 字符每边最可能的表达式。你可能认为下面的 Visual Basic Scripting Edition 和 VBScript 表达式将匹配位于一行的开始和结束位置且后跟一个或两个数字的 'Chapter' 或 'Section'：

/^Chapter|Section [1-9][0-9]{0,1}$/
"^Chapter|Section [1-9][0-9]{0,1}$"
不幸的是，真正的情况是上面所示的正则表达式要么匹配位于一行开始处的单词 'Chapter'，要么匹配一行结束处的后跟任何数字的 'Section'。如果输入字符串为 'Chapter 22'，上面的表达式将只匹配单词 'Chapter'。如果输入字符串为 'Section 22'，则该表达式将匹配 'Section 22'。但这种结果不是我们此处的目的，因此必须有一种办法来使正则表达式对于所要做的更易于响应，而且确实也有这种方法。

可以使用圆括号来限制选择的范围，也就是说明确该选择只适用于这两个单词 'Chapter' 和 'Section'。不过，圆括号同样也是难处理的，因为它们也用来创建子表达式，有些内容将在后面关于子表达式的部分介绍。通过采用上面所示的正则表达式并在适当位置添加圆括号，就可以使该正则表达式既可以匹配 'Chapter 1'，也可以匹配 'Section 3'。

下面的正则表达式使用圆括号将 'Chapter' 和 'Section' 组成一组，所以该表达式才能正确工作。对 Visual Basic Scripting Edition 为：

/^(Chapter|Section) [1-9][0-9]{0,1}$/
对 VBScript 为：

"^(Chapter|Section) [1-9][0-9]{0,1}$"
这些表达式工作正确，只是产生了一个有趣的副产品。在 'Chapter|Section' 两边放置圆括号建立了适当的编组，但也导致两个待匹配单词之一都被捕获供今后使用。由于在上面所示的表达式中只有一组圆括号，因此只能有一个捕获的 submatch。可以使用 VBScript 的Submatches 集合或者Visual Basic Scripting Edition 中RegExp 对象的 $1-$9 属性来引用这个子匹配。

有时捕获一个子匹配是所希望的，有时则是不希望的。在说明所示的示例中，真正想做的就是使用圆括号对单词 'Chapter' 或 'Section' 之间的选择编组。并不希望在后面再引用该匹配。实际上，除非真的是需要捕获子匹配，否则请不要使用。由于不需要花时间和内存来存储那些子匹配，这种正则表达式的效率将更高。

可以在正则表达式模式圆括号内部的前面使用 '?:'来防止存储该匹配供今后使用。对上面所示正则表达式的下述修改提供了免除子匹配存储的相同功能。对 Visual Basic Scripting Edition：

/^(?:Chapter|Section) [1-9][0-9]{0,1}$/
对 VBScript：

"^(?:Chapter|Section) [1-9][0-9]{0,1}$"
除了 '?:' 元字符，还有两个非捕获元字符用于称之为预查的匹配。一个为正向预查，用 ?= 表示， 在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串。一个为负向预查，用 '?!' 表示，在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。

例如，假定有一个包含引用有 Windows 3.1、Windows 95、Windows 98 以及 Windows NT 的文档。进一步假设需要更新该文档，方法是查找所有对 Windows 95、Windows 98 以及 Windows NT 的引用，并将这些引用更改为 Windows 2000。可以使用下面的 Visual Basic Scripting Edition 正则表达式，这是一个正向预查，来匹配 Windows 95、Windows 98 以及 Windows NT：

/Windows(?=95 |98 |NT )/
在 VBScript 要进行同样的匹配可以使用下述表达式：

"Windows(?=95 |98 |NT )"
找到一个匹配后，紧接匹配到的文字（而不包括预查中使用的字符）就开始对下一次匹配的搜索。例如，如果上面所示的表达式匹配到 'Windows 98'，则将从 'Windows' 而不是 '98' 之后继续查找。

© 2000 Microsoft Corporation 版权所有。保留所有权利。使用规定。


正则表达式简介 后向引用

后向引用

正则表达式一个最重要的特性就是将匹配成功的模式的某部分进行存储供以后使用这一能力。请回想一下，对一个正则表达式模式或部分模式两边添加圆括号将导致这部分表达式存储到一个临时缓冲区中。可以使用非捕获元字符 '?:', '?=', or '?!' 来忽略对这部分正则表达式的保存。

所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储。存储子匹配的缓冲区编号从 1 开始，连续编号直至最大 99 个子表达式。每个缓冲区都可以使用 '\n' 访问，其中 n 为一个标识特定缓冲区的一位或两位十进制数。

后向引用一个最简单，最有用的应用是提供了确定文字中连续出现两个相同单词的位置的能力。请看下面的句子：

Is is the cost of of gasoline going up up?

根据所写内容，上面的句子明显存在单词多次重复的问题。如果能有一种方法无需查找每个单词的重复现象就能修改该句子就好了。下面的 Visual Basic Scripting Edition 正则表达式使用一个子表达式就可以实现这一功能。

/\b([a-z]+) \1\b/gi

等价的 VBScript 表达式为：

"\b([a-z]+) \1\b"

在这个示例中，子表达式就是圆括号之间的每一项。所捕获的表达式包括一个或多个字母字符，即由'[a-z]+' 所指定的。该正则表达式的第二部分是对前面所捕获的子匹配的引用，也就是由附加表达式所匹配的第二次出现的单词。'\1'用来指定第一个子匹配。单词边界元字符确保只检测单独的单词。如果不这样，则诸如 "is issued" 或 "this is" 这样的短语都会被该表达式不正确地识别。

在 Visual Basic Scripting Edition 表达式中，正则表达式后面的全局标志 ('g') 表示该表达式将用来在输入字符串中查找尽可能多的匹配。大小写敏感性由表达式结束处的大小写敏感性标记 ('i') 指定。多行标记指定可能出现在换行符的两端的潜在匹配。对 VBScript 而言，在表达式中不能设置各种标记，但必须使用 RegExp 对象的属性来显式设置。

使用上面所示的正则表达式，下面的 Visual Basic Scripting Edition 代码可以使用子匹配信息，在一个文字字符串中将连续出现两次的相同单词替换为一个相同的单词：

var ss = "Is is the cost of of gasoline going up up?.\n";
var re = /\b([a-z]+) \1\b/gim;       //创建正则表达式样式.
var rv = ss.replace(re,"$1");   //用一个单词替代两个单词.

最接近的等价 VBScript 代码如下：

Dim ss, re, rv
ss = "Is is the cost of of gasoline going up up?." & vbNewLine
Set re = New RegExp
re.Pattern = "\b([a-z]+) \1\b"
re.Global = True
re.IgnoreCase = True
re.MultiLine = True
rv = re.Replace(ss,"$1")

请注意在 VBScript 代码中，全局、大小写敏感性以及多行标记都是使用 RegExp 对象的适当属性来设置的。

在replace 方法中使用 $1 来引用所保存的第一个子匹配。如果有多个子匹配，则可以用 $2, $3 等继续引用。

后向引用的另一个用途是将一个通用资源指示符 (URI) 分解为组件部分。假定希望将下述的URI 分解为协议 (ftp, http, etc)，域名地址以及页面/路径：

http://msdn.microsoft.com:80/scripting/default.htm

下面的正则表达式可以提供这个功能。对 Visual Basic Scripting Edition，为：

/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/

对 VBScript 为：

"(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)"

第一个附加子表达式是用来捕获该 web 地址的协议部分。该子表达式匹配位于一个冒号和两个正斜杠之前的任何单词。第二个附加子表达式捕获该地址的域名地址。该子表达式匹配不包括 '^'、 '/' 或 ':' 字符的任何字符序列。第三个附加子表达式捕获网站端口号码，如果指定了该端口号。该子表达式匹配后跟一个冒号的零或多个数字。最后，第四个附加子表达式捕获由该 web 地址指定的路径以及\或者页面信息。该子表达式匹配一个和多个除'#' 或空格之外的字符。

将该正则表达式应用于上面所示的 URI 后，子匹配包含下述内容：

RegExp.$1 包含 "http"

RegExp.$2 包含 "msdn.microsoft.com"

RegExp.$3 包含 ":80"

RegExp.$4 包含 "/scripting/default.htm"

© 2000 Microsoft Corporation 版权所有。保留所有权利。使用规定。


版权声明

    申江ASP留言本及本帮助的任何文字、图片、信息等，未经说明者，皆为MJ PC Lab版权所有，转载或引用须注明出处，即MJ PC Lab及网站地址（http://mjpclab.net）。
    提供美化界面版必须保留原版权声明，即MJ PC Lab及网站地址（http://mjpclab.net），且本帮助、管理工具和留言本主程序为不可分割的整体。
    MJ PC Lab不对本留言本使用过程中可能造成的潜在损失负责，使用者需自行安排好安全工作。
    您可以将此留言本用于商业目的的网站，但严禁出售或改造后出售此留言本，MJ PC Lab保留对其追究责任的权力。


关于

申江ASP留言本 标准版

版本：1.19

作者：马隽

所属组织：MJ PC Lab


联系方式

E-mail：

mjpclab@163.com

mjpclab@tom.com

QQ：

44699212

MSN Messenger：

mjpclab@hotmail.com

申江ASP留言本主页：

http://mjpclab.net/aspgbook

MJ PC Lab主页：

http://mjpclab.net