仓酷云

标题: PHP网站制作之揭开正则表达式语法的奥秘面纱 [打印本页]

作者: 变相怪杰    时间: 2015-2-4 00:20
标题: PHP网站制作之揭开正则表达式语法的奥秘面纱
掌握静态网页的制作技术是学习开发网站的先决条件,这一点就讲到这里,因为这篇文章不是教程文章,也就不对技术进行深入的刨析了。语法|正则   正则表达式(REs)凡是被毛病地以为是只要多数人了解的一种奥秘言语。在外表上它们的确看起来混乱无章,假如你不晓得它的语法,那末它的代码在你眼里只是一堆文字渣滓罢了。实践上,正则表达式长短常复杂而且可以被了解。读完这篇文章后,你将会知晓正则表达式的通用语法。

撑持多种平台

正则表达式最早是由数学家Stephen Kleene于1956年提出,他是在对天然言语的递增研讨功效的基本上提出来的。具有完全语法的正则表达式利用在字符的格局婚配方面上,后来被使用到熔融信息手艺范畴。自从那时起,正则表达式经由几个时代的开展,如今的尺度已被ISO(国际尺度组织)同意和被Open Group组织认定。

正则表达式并不是一门公用言语,但它可用于在一个文件或字符里查找和替换文本的一种尺度。它具有两种尺度:根基的正则表达式(BRE),扩大的正则表达式(ERE)。ERE包含BRE功效和别的其它的概念。

很多法式中都利用了正则表达式,包含xsh,egrep,sed,vi和在UNIX平台下的法式。它们可以被良多言语采用,如HTML 和XML,这些采用凡是只是全部尺度的一个子集。

比你想象的还要通俗
跟着正则表达式移植到穿插平台的法式言语的开展,这的功效也日趋完全,利用也逐步普遍。收集上的搜刮引擎利用它,e-mail法式也利用它,即便你不是一个UNIX法式员,你也能够利用划定规矩言语来简化你的法式而延长你的开辟工夫。

正则表达式101
良多正则表达式的语法看起来很类似,这是由于你之前你没有研讨过它们。通配符是RE的一个布局类型,即反复操作。让咱们先看一看ERE尺度的最通用的根基语法类型。为了可以供应具有特定用处的典范,我将利用几个分歧的法式。

字符婚配



正则表达式的关头的地方在于肯定你要搜刮婚配的器材,假如没有这一概念,Res将毫无用途。

每个表达式都包括需求查找的指令,如表A所示。

Table A: Character-matching regular expressions

操作
注释
例子
了局

.
Match any one character
grep .ord sample.txt
Will match “ford”, “lord”, “2ord”, etc. in the file sample.txt.

[ ]
Match any one character listed between the brackets
grep [cng]ord sample.txt
Will match only “cord”, “nord”, and “gord”

[^ ]
Match any one character not listed between the brackets
grep [^cn]ord sample.txt
Will match “lord”, “2ord”, etc. but not “cord” or “nord”



grep [a-zA-Z]ord sample.txt
Will match “aord”, “bord”, “Aord”, “Bord”, etc.



grep [^0-9]ord sample.txt
Will match “Aord”, “aord”, etc. but not “2ord”, etc.



反复操作符
反复操作符,或数目词,都描写了查找一个特定字符的次数。它们常被用于字符婚配语法以查找多行的字符,可拜见表B。

Table B: Regular expression repetition operators

操作
注释
例子
了局

?
Match any character one time, if it exists
egrep “?erd” sample.txt
Will match “berd”, “herd”, etc. and “erd”

*
Match declared element multiple times, if it exists
egrep “n.*rd” sample.txt
Will match “nerd”, “nrd”, “neard”, etc.

+
Match declared element one or more times
egrep “[n]+erd” sample.txt
Will match “nerd”, “nnerd”, etc., but not “erd”

{n}
Match declared element exactly n times
egrep “[a-z]{2}erd” sample.txt
Will match “cherd”, “blerd”, etc. but not “nerd”, “erd”, “buzzerd”, etc.

{n,}
Match declared element at least n times
egrep “.{2,}erd” sample.txt
Will match “cherd” and “buzzerd”, but not “nerd”

{n,N}
Match declared element at least n times, but not more than N times
egrep “n[e]{1,2}rd” sample.txt
Will match “nerd” and “neerd”



锚是指它所要婚配的格局,如图C所示。利用它能便利你查找通用字符的兼并。例如,我用vi行编纂器号令:s来代表substitute,这一号令的根基语法是:

s/pattern_to_match/pattern_to_substitute/


Table C: Regular expression anchors

操作
注释
例子
了局

^
Match at the beginning of a line
s/^/blah /
Inserts “blah “ at the beginning of the line

$
Match at the end of a line
s/$/ blah/
Inserts “ blah” at the end of the line

\<
Match at the beginning of a word
s/\</blah/
Inserts “blah” at the beginning of the word



egrep “\<blah” sample.txt
Matches “blahfield”, etc.

\>
Match at the end of a word
s/\>/blah/
Inserts “blah” at the end of the word



egrep “\>blah” sample.txt
Matches “soupblah”, etc.

\b
Match at the beginning or end of a word
egrep “\bblah” sample.txt
Matches “blahcake” and “countblah”

\B
Match in the middle of a word
egrep “\Bblah” sample.txt
Matches “sublahper”, etc.




距离

Res中的另外一可便的地方是距离(或拔出)符号。实践上,这一符号相当于一个OR语句并代表|符号。上面的语句前往文件sample.txt中的“nerd” 和 “merd”的句柄:

egrep “(n|m)erd” sample.txt


距离功效十分壮大,出格是当你寻觅文件分歧拼写的时分,但你可以鄙人面的例子失掉不异的了局:

egrep “[nm]erd” sample.txt

当你利用距离功效与Res的初级特征毗连在一同时,它的真正用途更能表现出来。

一些保存字符
Res的最初一个最主要特征是保存字符(也称特定字符)。例如,假如你想要查找“ne*rd”和“ni*rd”的字符,格局婚配语句“n[ei]*rd”与“neeeeerd” 和 “nieieierd”符合合,但并非你要查找的字符。由于‘*’(星号)是个保存字符,你必需用一个反斜线符号来替换它,即:“n[ei]\*rd”。其它的保存字符包含:

^ (carat)
. (period)
[ (left bracket}
$ (dollar sign)
( (left parenthesis)
) (right parenthesis)
| (pipe)
* (asterisk)
+ (plus symbol)
? (question mark)
{ (left curly bracket, or left brace)
\ backslash
一旦你把以上这些字符包含在你的字符搜刮中,毫无疑问Res变得十分的难读。好比说以下的PHP中的eregi搜刮引擎代码就很难读了。

eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$",$sendto)

你可以看到,法式的意图很难掌控。但假如你抛开保存字符,你经常会毛病地舆解代码的意思。

总结
在本文中,咱们揭开了正则表达式的奥秘面纱,并列出了ERE尺度的通用语法。假如你想阅览Open Group组织的划定规矩的完全描写,你可以拜见:Regular Expressions,接待你在个中的会商区宣布你的成绩或概念。

  建议大家买一本书,而不光是在网上看一些零碎的资料,一本书毕竟会讲的系统一些,全面一些,而且印刷的书不受电脑的限制,但是建议在看书的时候最好旁边有电脑,这样可以很及时地上机实践。
作者: 蒙在股里    时间: 2015-2-4 11:56
你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。
作者: 因胸联盟    时间: 2015-2-5 00:33
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
作者: 谁可相欹    时间: 2015-2-6 17:03
首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。
作者: 乐观    时间: 2015-2-8 01:57
这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。
作者: 小妖女    时间: 2015-2-9 01:22
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
作者: 小女巫    时间: 2015-2-11 08:47
这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。
作者: 变相怪杰    时间: 2015-3-1 12:00
没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。
作者: 透明    时间: 2015-3-2 02:47
实践是检验自己会不会的真理。
作者: 莫相离    时间: 2015-3-8 10:53
你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。
作者: 飘飘悠悠    时间: 2015-3-15 22:05
使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。
作者: 飘灵儿    时间: 2015-3-17 12:08
这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。
作者: 简单生活    时间: 2015-3-21 13:09
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
作者: 只想知道    时间: 2015-3-31 04:20
Ps:以上纯属原创,如有雷同,纯属巧合
作者: 柔情似水    时间: 2015-4-11 06:47
说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年  具体的记不清啦,囧。
作者: 若天明    时间: 2015-4-15 23:32
遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。
作者: 仓酷云    时间: 2015-5-4 10:57
遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。
作者: 金色的骷髅    时间: 2015-5-5 21:10
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
作者: 小魔女    时间: 2015-5-9 09:48
这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2