若天明 发表于 2015-1-16 22:11:18

ASP编程:正则表达式在网页处置中的使用四则

ASP.NET和ASP的比较,技术上比较已经没什么可说的了.新一代在大部分程度来说当然是比旧一代好了.关键看你对所做软件的理解了.因人而定.会写的话也可能比ASP.NET写得更有效率和更方便重用网页|正则  正则表达式(RegularExpression)为字符串形式婚配供应了一种高效、便利的办法。几近一切初级言语都供应了对正则表达式的撑持,大概供应了现成的代码库供挪用。本文以ASP情况中罕见的处置义务为例,先容正则表达式的使用技能。

  1、查验暗码和邮件地点的格局

  我们的第一个实例树模正则表达式的一项基础功效:笼统地形貌恣意庞大的字符串。它的意义就是,正则表达式赐与程序员一种情势化的字符串形貌办法,只需很少的代码便可形貌出使用碰到的恣意字符串形式。比方,关于不处置手艺事情的人来讲,暗码格局的请求能够形貌以下:暗码的第一个字符必需是字母,暗码起码4个字符且不凌驾15个字符,暗码不克不及包括除字母、数字和下划线之外的字符。

  作为程序员,我们必需把下面对暗码格局的天然言语形貌转换成其他情势,使得ASP页面可以了解并使用它来避免不法的暗码输出。形貌这个暗码格局的正则表达式是:^w{3,14}$。

  在ASP使用里,我们能够把暗码考证历程写成可重用的函数,以下所示:

FunctionTestPassword(strPassword)
Dimre
Setre=newRegExp

re.IgnoreCase=false
re.global=false
re.Pattern="^w{3,14}$"

TestPassword=re.Test(strPassword)
EndFunction
  上面我们把这个查验暗码格局的正则表达式和天然言语形貌对照着看看:

  暗码的第一个字符必需是字母:正则表达式形貌是“^”,个中“^”暗示字符串的入手下手,连字符告知RegExp婚配指定局限的一切字符。

  暗码起码4个字符且不凌驾15个字符:正则表达式形貌是“{3,14}”。

  暗码不克不及包括除字母、数字和下划线之外的字符:正则表达式形貌是“w”。

  几点申明:{3,14}暗示后面的形式婚配最少3个、但不凌驾14个的字符(加上第一个字符就成了4到15个字符)。注重花括号内的语法请求极为严厉,不同意在逗号的双方到场空格。假如到场了空格,它将对正则表达式的寄义发生影响,招致暗码格局查验时发生毛病。别的,下面的正则表达式开端也没有加上“$”字符。$字符使得正则表达式婚配字符串直至开端,确保正当的暗码前面没有加上任何其他字符。

  相似于暗码格局查验,反省email地点的正当性也是一个很罕见的成绩,用正则表达式举行复杂的email地点查验能够完成以下:

<%
Dimre
Setre=newRegExp

re.pattern="^w+@+?.{2,3}$"
Response.Writere.Test("aabb@yahoo.com")
%>
  2、提取HTML页面的特定部分

  从HTML页面提取内容所面对的次要成绩是,我们必需寻觅一种办法准确地辨认出本人想要的那一部份内容。比方,上面是一个显现旧事题目的HTML代码片段:

<tableborder="0"width="11%"class="Somestory">
<tr>
<tdwidth="100%">
<palign="center">其他内容...</td>
</tr>
</table>
<tableborder="0"width="11%"class="Headline">
<tr>
<tdwidth="100%">
<palign="center">伊拉克和平!</td>
</tr>
</table>
<tableborder="0"width="11%"class="Someotherstory">
<tr>
<tdwidth="100%">
<palign="center">其他内容...</td>
</tr>
</table>
  察看上述代码,很简单看出旧事题目由位于两头的表格显现,它的class属性设置为Headline。假如HTML页面十分庞大,利用MicrosoftIE从5.0入手下手供应的一项附加功效能够只检察被选中部分页面的HTML代码,请会见http://www.microsoft.com/Windows/ie/WebAccess/default.ASP懂得概况。关于本例,我们假定这是独一class属性设置为Headline的表格。如今我们要创立正则表达式,经由过程正则表达式找到这个Headline表格并把这个表格包括到本人的页面中。起首是编写撑持正则表达式的代码:

<%
Dimre,strHTML
Setre=newRegExp创立正则表达式工具

re.IgnoreCase=true
re.Global=false第一次婚配以后停止查找
%>
  上面思索一下我们要提取的地区:在这里,我们要提取的是全部<table>布局,包含停止标志和旧事题目的文本。因而查找的肇端字符应当是<table>入手下手标志:re.Pattern="<table.*(?=Headline)"。这个正则表达式婚配表格的入手下手标志,可以前往入手下手标志直至“Headline”之间的一切内容(换行除外)。上面是前往已婚配HTML代码的办法:

把一切婚配的HTML代码放进Matches汇合
SetMatches=re.Execute(strHTML)

显现一切婚配的HTML代码
ForEachIteminMatches
Response.WriteItem.Value
Next

显现个中一项
Response.writeMatches.Item(0).Value
  运转这段代码处置后面显现的HTML片段,正则表达式前往一次婚配的内容以下:<tableborder="0"width="11%"class="。正则表达式中的“(?=Headline)”没有猎取字符,以是不克不及看到表格class属性的值。要猎取表格残剩部分的代码也相称复杂:re.Pattern="<table.*(?=Headline)(.|
)*?</table>"。个中:“(.|
)”前面的“*”婚配0个到多个恣意字符;而“?”使得“*”婚配局限最小化,即在找到表达式的下一部分之前婚配尽量少的字符。</table>是表格的停止标志。

  “?”限定符十分主要,它避免了表达式前往其他表格的代码。比方关于后面给出的HTML代码片段,假如删除这个“?”则前往内容将是:

<tableborder="0"width="11%"class="Headline">
<tr>
<tdwidth="100%">
<palign="center">伊拉克和平!</td>
</tr>
</table>
<tableborder="0"width="11%"class="Someotherstory">
<tr>
<tdwidth="100%">
<palign="center">其他内容...</td>
</tr>
</table>
  前往的内容不但包括了Headline表的<table>标志,并且还包括了Someotherstory表格,由此能够看出,这里的“?”是必不成少的。

  本例假定了一些相称幻想化的条件。实践使用中情形常常要庞大很多,出格是你对正在利用的源HTML代码的编写没有任何影响力时,编写ASP代码尤其坚苦。最无效的办法是,多花些工夫剖析待提取内容四周的HTML,常常地测试,确保提掏出来的内容恰是本人所必要的。别的,应该器重并处置正则表达式不克不及婚配源HTML页面任何内容的情况。内容的更新大概十分疾速,不要只由于他人改动了内容的格局而让本人的页面呈现初级好笑的毛病。
  3、剖析文本数据文件

  数据文件的格局和品种良多,XML文档、布局化文本乃至非布局化文本都常常成为ASP使用的数据源。上面我们要看的一个例子是利用限制符的布局化文本文件。限制符(好比引号)暗示字符串各个部分不成支解,即便字符串外部包括把纪录分开成字段的分开符也一样。

  上面是一个复杂的布局化文本文件:

姓,名,德律风,申明
孙,悟空,3125555656,ASP很好
猪,八戒,8475555656,我是影戏制片人
  这个文件十分复杂,它的第一行是题目,上面两行是用逗号作为分开符的纪录。要剖析这个文件也很复杂,只需先把文件支解成行(依据换行标记),然后把各个纪录依照字段支解。可是,假如我们在某个字段内容中到场了逗号:

姓,名,德律风,申明
孙,悟空,3125555656,我喜好ASP,另有VB和SQL
猪,八戒,8475555656,我是影戏制片人
  剖析第一个纪录时就会呈现成绩,由于在只承认逗号分开符的剖析器看来它的最初一个字段包括了两个字段的内容。为了不呈现这类成绩,包括分开符的字段必需用限制符包抄。单引号就是一种经常使用的限制符。把下面的文本文件加上单引号限制符以后,它的内容以下所示:

姓,名,德律风,申明
孙,悟空,3125555656,我喜好ASP,另有VB和SQL
猪,八戒,8475555656,我是影戏制片人
  如今我们可以一定哪个逗号是分开符、哪个逗号是字段内容了,即只需把引号外部呈现的逗号视为字段的内容。接上去我们要做的就是完成一个正则表达式剖析器,由这个剖析器断定什么时候依据逗号支解字段、什么时候把逗号视为字段内容。

  这里的成绩与年夜多半正则表达式所面对的略有分歧。一般我们检察的是文本的一小部分,看看它是不是可以和正则表达式婚配。但在这里,只要思索了整行文本以后我们才干牢靠地判别出哪些内容位于引号以内。

  上面是一个申明该成绩的例子。从某个文本文件随便抽取半行内容,失掉:1,沙岸,玄色,21,,狗,猫,鸭子,,。在这个例子中,由于“1”的右边另有其他数据,要剖析分明它的内容是极为坚苦的。我们不晓得这个数据片段的后面有几单引号,从而也就没法判别哪些字符位于引号以内(在引号以内的文本剖析时不克不及支解)。假如这个数据片段之前有偶数个(大概没有)单引号,那末“,狗,猫,鸭子,”是用引号界定的字符串且不成支解。假如后面的引号数目是奇数,那末“1,沙岸,玄色,21,”是某个字符串的停止部分且不成支解。

  因而,正则表达式必需剖析整行文本,周全思索呈现了几引号才干断定字符是处在引号对的外部仍是内部,即:,(?=([^]*[^]*)*(?![^]*))。这个正则表达式起首找到一个引号,然后持续查找并包管逗号前面的单引号数目大概是偶数、大概是0。该正则表达式以上面这个判别为基本:假如逗号前面的单引号数目是偶数,那末这个逗号位于字符串以外。下表给出了更具体的申明:

,寻觅一个逗号(?=持续向前查找以婚配上面这个形式:(入手下手一个新的形式[^]*[非引号字符]0个大概多个,然后是一个引号[^]*[^]*)[非引号字符]0个大概多个,然后是一个引号。分离后面的内容以后它婚配引号对)*停止形式并婚配全部形式(引号对)0次大概屡次(?!向前查找,扫除此形式[^]*[非引号字符]0个大概多个,然后是一个引号)停止形式
  上面是一个VBScript函数,它承受一个字符串参数,依据字符串中的逗号分开符、单引号限制符支解字符串,前往了局数组:

FunctionSplitAdv(strInput)
DimobjRE
SetobjRE=newRegExp

设置RegExp工具
objRE.IgnoreCase=true
objRE.Global=true
objRE.Pattern=",(?=([^]*[^]*)*(?![^]*))"

Replace办法用chr(8)交换我们要用到的逗号,chr(8)即
字符,在字符串中呈现的大概极其巨大。
然后我们依据把字符串支解保留到数组
SplitAdv=Split(objRE.Replace(strInput,""),"")
EndFunction
  总而言之,用正则表达式剖析文本数据文件具有高效、延长开辟工夫的长处,可以节俭大批剖析文件、依据庞大的前提提取有效数据的工夫。在一个敏捷开展的情况中仍会有很多传统的数据可资使用,把握怎样机关高效的数据剖析例程将是一种可贵的妙技。

  4、字符串交换

  在最初一个例子中我们要看看VBScript正则表达式的交换功效。ASP常常用于静态地格局化从各类数据源取得的文本。使用VBScript正则表达式的壮大功效,ASP可以静态地改动婚配的庞大文本。经由过程到场HTML标志凸起显现部分单词就是一种罕见的使用,好比凸起显现搜刮了局中的搜刮关头词。

  为申明完成办法,上面我们来看一个凸起显现字符串中一切“.NET”的例子。这个字符串能够从任何中央取得,好比数据库大概其他Web网站。

<%
SetregEx=NewRegExp
regEx.Global=true
regEx.IgnoreCase=True

正则表达式形式,
寻觅任何开头为“.NET”的单词大概URL。
regEx.Pattern="(+?.NET)"

用于测试交换功效的字符串
strText="微软创建了一个新网站www.ASP.NET。"

挪用正则表达式的Replace办法
$1暗示把婚配的文本拔出以后地位
Response.WriteregEx.Replace(strText,_
"<bstyle=color:#000099;font-size:18pt>$1</b>")
%>
  这个例子中有几个主要的中央必需注重。全部正则表达式被放进了一对圆括号中,它的感化是截取一切婚配的内容供今后利用,这些内容在交换文本中经由过程$1援用。相似的截取每次交换可使用多达9个,分离经由过程$1到$9援用。正则表达式的Replace办法和VBScript自己的Replace函数分歧,它只必要两个参数:被搜刮的文本,交换用的文本。

  在这个例子中,为了凸起显现搜刮到的“.NET”字符串,我们用粗体标志和其他款式属性来包抄这些字符串。利用这类搜刮和交换手艺,我们可以便利地为网站搜刮程序加上凸起显现搜刮关头词的功效,大概主动为页面中呈现的关头词加上指向其他页面的链接。

  停止语

  但愿本文先容的几种正则表达式技能对你在什么时候、怎样使用正则表达式有所启示。固然本文的例子用VBScript编写,但在ASP.NET中正则表达式一样也年夜有效武之地,它是服务器端控件表单查验的次要机制之一,并且经由过程System.Text.RegularExpressions定名空间导出到了全部.NET框架当中。
ASP由于使用了COM组件所以它会变的十分强大,但是这样的强大由于WindowsNT系统最初的设计问题而会引发大量的安全问题。只要在这样的组件或是操作中一不注意,哪么外部攻击就可以取得相当高的权限而导致网站瘫痪或者数据丢失;

分手快乐 发表于 2015-1-18 21:58:34

作为IE上广为流传的动态网页开发技术,ASP以它简单易学博得了广大WEB程序爱好这的青睐,而且它对运行环境和开发品台的不挑剔,以及有大量有效的参考手册,极大的推广了它的发展。

山那边是海 发表于 2015-1-24 19:16:14

跟学别的语言一样,先掌握变量,流程控制语句(就是ifwhileselect)等,函数/过程,数组

莫相离 发表于 2015-2-2 12:43:58

如何学好ASP,以前也有人问过,把回答给你转过来看看能否对你有帮助:

小女巫 发表于 2015-2-7 20:15:52

接下来就不能纸上谈兵了,最好的方法其实是实践。实践,只能算是让你掌握语言特性用的。而提倡做实际的Project也不是太好,因为你还没有熟练的能力去综合各种技术,这样只能使你自己越来越迷糊。

金色的骷髅 发表于 2015-2-23 10:29:15

如何学好ASP,以前也有人问过,把回答给你转过来看看能否对你有帮助:

爱飞 发表于 2015-3-7 08:12:20

还有如何才能在最短的时间内学完?我每天可以有效学习2小时,双休日4小时。

小妖女 发表于 2015-3-14 17:44:03

运用ASP可将VBscript、javascript等脚本语言嵌入到HTML中,便可快速完成网站的应用程序,无需编译,可在服务器端直接执行。容易编写,使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行。

飘飘悠悠 发表于 2015-3-21 13:19:52

学习ASP其实应该上升到如何学习程序设计这种境界,其实学习程序设计又是接受一种编程思想。比如ASP如何学习,你也许在以前的学习中碰到过。以下我仔细给你说几点:
页: [1]
查看完整版本: ASP编程:正则表达式在网页处置中的使用四则