ASP中正则表达式的应用-正则表达式_正则表达式_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

ASP中正则表达式的应用-正则表达式

作者:黑客防线网安网站维护基地 来源:黑客防线网安网站维护基地 浏览次数:0

本篇关键词:asp表达式应用
黑客防线网安网讯:
一、正则表达式概述 
  如果原来没有使用过正则表达式,那么可能对这个术语和概念会不太熟悉。不过,他们并不是你想象的那么新奇。 
  请回想一下在硬盘上是怎么查找文件的。你肯定会使用 ? 和 * 字符来帮助查


一、正则表达式概述
  如果原来没有使用过正则表达式那么可能对这个术语和概念会不太熟悉不过他们并不是你想象的那么新奇
  请回想一下在硬盘上是怎么查找文件的。你肯定会使用 ? 和 * 字符来帮助查找你正寻找的文件。? 字符匹配文件名中的单个字符,而 * 则匹配一个或多个字符。一个如 data?.dat 的模式能找到下述文件:data1.dat、data2.dat等等。如果使用 * 字符代替 ? 字符,则将扩大找到的文件数量。data*.dat 能匹配下述所有文件名:data.dat、data1.dat、data12.dat等等,尽管这种搜索文件的方法肯定非常有用,但也十分有限。? 和 * 通配符的有限能力能使你对正则表达式能做什么有一个概念,不过正则表达式的功能更强大,也更灵活。
  在我们编写asp程式时,经常会判断一个字符串的有效性,如;一个串是否是数字、是否是有效的email地址等等。如果不使用正则表达式,那么判断的程式会非常长,并且容易出错,如果使用正则表达式,这些判断就是一件非常轻松的工作了。后面我们将介绍怎么判断数字和email地址的有效性。
  在典型的搜索和替换操作中,必须提供要查找的确切文字。这种技术对于静态文本中的简单搜索和替换任务可能足够了,不过由于他缺乏灵活性,因此在搜索动态文本时就有困难了,甚至是不可能的。
  使用正则表达式,能完成些什么事情呢?
  测试字符串的某个模式。例如,能对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。
  替换文本。能在文件中使用一个正则表达式来标识特定文字,然后能全部将其删除,或替换为别的文字。
  根据模式匹配从字符串中提取一个子字符串。能用来在文本或输入字段中查找特定文字。
  例如,如果需要搜索整个 web 站点来删除某些过时的材料并替换某些html 格式化标记,则能使用正则表达式对每个文件进行测试,看在该文件中是否存在所要查找的材料或 html 格式化标记。用这个方法,就能将受影响的文件范围缩小到包含要删除或更改的材料的那些文件。然后能使用正则表达式来删除过时的材料,最后,能再次使用正则表达式来查找并替换那些需要替换的标记。
  那么,正则表达式语法的语法是怎么呢?
  一个正则表达式就是由普通字符(例如字符 a 到 z)及特别字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式和所搜索的字符串进行匹配。
  这里有一些可能会遇见的正则表达式示例:
  /^\[ \t]*$/ "^\[ \t]*$" 匹配一个空白行。
  /\d{2}-\d{5}/ "\d{2}-\d{5}" 验证一个id 号码是否由一个2位数字,一个连字符及一个5位数字组成。
  /<(.*)>.*<\/\1>/ "<(.*)>.*<\/\1>" 匹配一个 html 标记。

  二、正则表达式在vbscript中的应用
  vbscript使用regexp对象、matches集合及match对象提供正则表达式支持功能。我们还是先看一个例子。
<%
function regexptest(patrn, strng)
dim regex, match, matches   建立变量。
set regex = new regexp   建立正则表达式。
regex.pattern = patrn  设置模式。
regex.ignorecase = true   设置是否区分字符大小写。
regex.global = true   设置全局可用性。
set matches = regex.execute(strng)  执行搜索。
for each match in matches  遍历匹配集合。
retstr = retstr & "match found at position "
retstr = retstr & match.firstindex & ". match value is "
retstr = retstr & match.value & "." & "<br>"
next
regexptest = retstr
end function
response.write regexptest("[ij]s.", "is1 js2 is3 is4")
%>
在这个例子中,我们查找字符串中有无is或js这两个词,忽略大小写。运行的结果如下:
match found at position 0. match value is is1.
match found at position 4. match value is js2.
match found at position 8. match value is is3.
match found at position 12. match value is is4.
下面我们就介绍这三个对象和集合。
  1、regexp对象是最重要的一个对象,他有几个属性,其中:
  ○global 属性,设置或返回一个 boolean 值,该值指明在整个搜索字符串时模式是全部匹配还是只匹配第一个。如果搜索应用于整个字符串,global 属性的值为 true,否则其值为 false。默认的设置为 false。
  ○ignorecase 属性,设置或返回一个boolean值,指明模式搜索是否区分大小写。如果搜索是区分大小写的,则 ignorecase 属性为 false;否则为 true。缺省值为 false。
  ○pattern 属性,设置或返回被搜索的正则表达式模式。必选项。总是个 regexp 对象变量。
  2、match 对象
  匹配搜索的结果是存放在match对象中,提供了对正则表达式匹配的只读属性的访问。 match 对象只能通过 regexp 对象的 execute 方法来创建,该方法实际上返回了 match 对象的集合。所有的 match 对象属性都是只读的。在执行正则表达式时,可能产生零个或多个 match 对象。每个 match 对象提供了被正则表达式搜索找到的字符串的访问、字符串的长度,及找到匹配的索引位置等。
  ○firstindex 属性,返回在搜索字符串中匹配的位置。firstindex 属性使用从零起算的偏移量,该偏移量是相对于搜索字符串的起始位置而言的。换言之,字符串中的第一个字符被标识为字符 0
  ○length 属性,返回在字符串搜索中找到的匹配的长度。
  ○value 属性,返回在一个搜索字符串中找到的匹配的值或文本。
  3、matches 集合
  正则表达式 match 对象的集合。matches 集合中包含若干独立的 match 对象,只能使用 regexp 对象的 execute 方法来创建之。和独立的 match 对象属性相同,matches `集合的一个属性是只读的。在执行正则表达式时,可能产生零个或多个 match 对象。每个 match 对象都提供了和正则表达式匹配的字符串的访问入口、字符串的长度,及标识匹配位置的索引。
  学习了这三个对象和集合,怎么应用于字符串的判断和替换呢?regexp对象的三个方法正好解决了这个问题,他们是replace方法、test方法和execute方法。
  1、replace 方法
  替换在正则表达式查找中找到的文本。我们还是先看个例子:下面的例子说明了 replace 方法的用法。
<%
function replacetest(patrn, replstr)
dim regex, str1 建立变量。
str1 = "the quick brown fox jumped over the lazy dog."
set regex = new regexp 建立正则表达式。
regex.pattern = patrn 设置模式。
regex.ignorecase = true 设置是否区分大小写。
replacetest = regex.replace(str1, replstr) 作替换。
end function
response.write replacetest("fox", "cat") & "<br>" 将 fox 替换为 cat。
response.write replacetest("(\s+)(\s+)(\s+)", "$3$2$1") 交换词对.
%>
  2、test 方法
  对指定的字符串执行一个正则表达式搜索,并返回一个 boolean 值指示是否找到匹配的模式。正则表达式搜索的实际模式是通过regexp对象的pattern属性来设置的。regexp.global属性对test方法没有影响。
  如果找到了匹配的模式,test方法返回true;否则返回false。下面的代码说明了test 方法的用法。
<%
function regexptest(patrn, strng)
dim regex, retval 建立变量。
set regex = new regexp 建立正则表达式。
regex.pattern = patrn 设置模式。
regex.ignorecase = false 设置是否区分大小写。
retval = regex.test(strng) 执行搜索测试。
if retval then
regexptest = "找到一个或多个匹配。"
else
regexptest = "未找到匹配。"
end if
end function
response.write regexptest("is.", "is1 is2 is3 is4")
%>
  3、execute 方法
  对指定的字符串执行正则表达式搜索。正则表达式搜索的设计模式是通过 regexp 对象的 pattern 来设置的。
  execute 方法返回一个 matches 集合,其中包含了在 string 中找到的每一个匹配的 match 对象。如果未找到匹配,execute 将返回空的 matches 集合。

  三、javascript中正则表达式的使用
  在javascript 1.2版以后,javascript也支持正则表达式。
  1、replace
  replace在一个字符串中通过正则表达式查找替换相应的内容。replace并不改动原来的字符串,只是重新生成了一个新的字符串。如果需要执行全局查找或忽略大小写,那么在正则表达式的最后添加g和i。
例:
<script>
re = /apples/gi;
str = "apples are round, and apples are juicy.";
newstr=str.replace(re, "oranges");
document.write(newstr)
</script>
结果是:"oranges are round, and oranges are juicy."
例:
<script>
str = "twas the night before xmas...";
newstr=str.replace(/xmas/i, "christmas");
document.write(newstr)
</script>
结果是:"twas the night before christmas..."
例:
<script>
re = /(\w+)\s(\w+)/;str = "john smith";
newstr = str.replace(re, "$2, $1");
document.write(newstr)
</script>
结果是:"smith, john".
  2、search
search通过正则表达式查找相应的字符串,只是判断有无匹配的字符串。如果查找成功,search返回匹配串的位置,否则返回-1。
         search(regexp)
<script>
function testinput(re, str){
if (str.search(re) != -1)
midstring = " contains ";
else
midstring = " does not contain ";
document.write (str + midstring + re.source);
}
testinput(/^[1-9]/i,"123")
</script>
  3、match
  match方法执行全局查找,查找结果存放在一个数组里。
例一:
<script>
str = "for more information, see chapter 3.4.5.1";
re = /(chapter \d+(\.\d)*)/i;
found = str.match(re);
document.write(found);
</script>
显示结果:chapter 3.4.5.1,chapter 3.4.5.1,.1
例二:
<script>
str = "abcddcba";
newarray = str.match(/d/gi);
document.write(newarray);
</script>
显示结果d, d.

  四、示例
1 、判断数字的正确性
<%@ language=vbscript %>
<script language="javascript" runat="server">
function isnumeric(strnumber) {
return (strnumber.search(/^(-|\+)?\d+(\.\d+)?$/) != -1);
}
function isunsignednumeric(strnumber) {
return (strnumber.search(/^\d+(\.\d+)?$/) != -1);
}
function isinteger(strinteger) {
return (strinteger.search(/^(-|\+)?\d+$/) != -1);
}
function isunsignedinteger(strinteger) {
return (strinteger.search(/^\d+$/) != -1);
}
</script>
<html>
<body>
<b>判断数字的正确性</b>
<%
dim strtemp
strtemp = cstr(request.form("inputstring"))
if strtemp = "" then strtemp = "0"
%>
<table border="1" cellpadding="4" cellspacing="2">
<tr>
<td align="right"><b>原始字符串</b></td>
<td><%= strtemp %></td>
</tr>
<tr>
<td align="right"><b>数字</b></td>
<td><%=isnumeric(strtemp)%></td>
</tr>
<tr>
<td align="right"><b>非负数字</b></td>
<td><%=isunsignednumeric(strtemp)%></td>
</tr>
<tr>
<td align="right"><b>整数</b></td>
<td><%=isinteger(strtemp)%></td>
</tr>
<tr>
<td align="right"><b>非负整数()</b></td>
<td><%=isunsignedinteger(strtemp)%></td>
</tr>
</table>
<form action="<%=request.servervariables("script_name")%>" method="post">
请输入一个数字:<br>
<input type="text" name="inputstring" size="50"></input><br>
<input type="submit" value="提交"></input><br>
</form>
</body>
</html>
2、判断email地址的正确性
<%
function isemail(strng)
isemail = false
dim regex, match
set regex = new regexp
regex.pattern = "^\w+((-\w+)|(\.\w+))*\@[a-za-z0-9]+((\.|-)[a-za-z0-9]+)*\.[a-za-z0-9]+$"
regex.ignorecase = true
set match = regex.execute(strng)
if match.count then isemail= true
end function
%>


五、总结
  上面我们介绍了正则表达式的基本概念,及在vbscript和javascript中怎么使用正则表达式,同时,通过一些实例让大家有了感性的认识。正则表达式的应用范围非常广,能为大家解决非常多实际中的问题。本文介绍的内容只是一些初步的知识,更有非常多语法规则需要大家继续学习,在实践中发现问题,解决问题。 返回顶部


             怎么实现数据记录的分页显示(作者:darkman)

怎么实现数据记录的分页显示 (1)

通过recordset的getrows方法,能实现数据记录的分页显示。下面是个完整的例子:
<%@ language = vbscript %>
<% option explicit %>
<%
dim istart, ioffset
istart = request("start")
ioffset = request("offset")

if not isnumeric(istart) or len(istart) = 0 then
  istart = 0
else
  istart = cint(istart)
end if

if not isnumeric(ioffset) or len(ioffset) = 0 then
  ioffset = 10
else
  ioffset = cint(ioffset)
end if

response.write "察看 " & ioffset & " 个记录从 " & istart & "开始 <br>"

dim objconn, objrs
set objconn = server.createobject("adodb.connection")
objconn.open "provider=sqloledb.1;data source=(local);uid=sa;pwd=;initial    catalog=pubs"

set objrs = server.createobject("adodb.recordset")
objrs.open "select * from authors", objconn

dim aresults
aresults = objrs.getrows

objrs.close
set objrs = nothing

objconn.close
set objconn = nothing

dim irows, icols, irowloop, icolloop, istop
irows = ubound(aresults, 2)
icols = ubound(aresults, 1)

if irows > (ioffset + istart) then
  istop = ioffset + istart - 1
else
  istop = irows
end if

for irowloop = istart to istop
  for icolloop = 0 to icols
 response.write aresults(icolloop, irowloop) & " "
 next
  response.write "<br>"
 next

response.write "<p>"
if istart > 0 then
显示“前 10个”连接
  response.write "<a href=""paging.asp?start=" & istart-ioffset & _
 "&offset=" & ioffset & """>前 " & ioffset & "</a>"
 end if

if istop < irows then
显示“后 10个”连接
 response.write " <a href=""paging.asp?start=" & istart+ioffset & _
  "&offset=" & ioffset & """>后 " & ioffset & "</a>"
end if
%>


怎么实现数据的分页显示(2)
这里介绍另外一种分页显示的方法,是通过 ms sql的存储过程。本方法不适用于access数据库。
假设我们要对数据表mytable的数据实现分页显示,首先写一个存储过程 如下:
create procedure sp_pageditems
 (
  @page int,
  @recsperpage int
  )
  as

  -- 加快表的 插入速度
  set nocount on

  -- 开始记录 号
  declare @reccount int
  select @reccount = @recsperpage * @page + 1

  --创建临时 表
  create table #tempitems
  (
  id int identity,
  name varchar(50),
  price currency
 )

  -- 准备临时 表
  insert into #tempitems (name, price)
  select name,price from mytable order by price

  -- 求出要查 询的最小id和最大id
  declare @firstrec int, @lastrec int
  select @firstrec = (@page - 1) * @recsperpage
  select @lastrec = (@page * @recsperpage + 1)

  -- 得到实际 的记录,并返回是否更有数据!
  select *,
  morerecords =
 (
  select count(*)
  from #tempitems ti
  where ti.id >= @lastrec
 )
  from #tempitems
  where id > @firstrec and id < @lastrec

  -- 恢复设置
  set nocount off

  在这个存储过程里,我们首先创建一个全部 记录的临时表,并增加了一个自动编号的字段id。这样,不同的记录就有一个递增的唯一标志。
  根据当前的页号和每页的记录数,能计算 出每页的最小和最大的id。从而得到当前页的所有记录。
  为了显示的方便,存储过程还计算了 morerecords字段,作为显示下一页的判断条件。
  利用了这个存储过程的程式代码如下:
 <%
  每页显示10条
  const irecordsperpage = 10

  dim currentpage 当前页号
  dim bollastpage 在最后一页?
  
 if len(request.querystring("page")) = 0 then
   currentpage = 1
 else
   currentpage = cint(request.querystring("page"))
 end if

  得到当前页的记录
  strsql = "sp_pageditems " & currentpage & "," & irecordsperpage
  objrs.open strsql, objconn
  
  判断是否在最后一页
 if not objrs.eof then
   if cint(objrs("morerecords")) > 0 then
    bollastpage = false
   else
    bollastpage = true
   end if
  end if
  %>
  <p>

 <table border=0 cellspacing=1 cellpadding=4 align=center>
  <tr><th colspan=2 bgcolor=navy>
  <font size=+1 color=white>
    list of items
  </font>
  </th></tr>
 <%
  do while not objrs.eof %>
   <tr><td align=left bgcolor=gray>
   <%=objrs("name")%>
   </td><td align=center bgcolor=gray>
   <%=formatcurrency(objrs("price"))%>
   </td></tr>
  <% objrs.movenext
  loop %>
 </table>
  <p>
  <center>
 <%

  第一页不 显示“前一页”
 if currentpage > 1 then %>
  <input type=button value="<< 前 <%=imaxrecords%> 记录 "
  onclick="document.location.href=thispage.asp?page=<%=currentpage-1%>">
  
 <% end if

  最后一页 不显示“后一页”
 if not bollastpage then %>
  <input type=button value="后 <%=imaxrecords%> 记录 >>"
  onclick="document.location.href=thispage.asp?page=<%=currentpage+1%>">
 <% end if %>
  </center>

    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-4780-1.html
网站维护教程更新时间:2011-02-24 14:44:53  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer