您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 统计图表 > php正则表达式资料整理,资料齐全适合新手学习,老手快速查阅
什么是正则表达式:简单的说,正则表达式是一种可以用于模式匹配和替换的强大工具。在几乎所有的基于UNIX/LINUX系统的软件工具中找到正则表达式的痕迹,例如:Perl或PHP脚本语言。此外,JavaScript这种客户端的脚本语言也提供了对正则表达式的支持,现在正则表达式已经成为了一个通用的概念和工具,被各类技术人员所广泛使用。在某个Linux网站上面有这样的话:如果你问一下Linux爱好者最喜欢什么,他可能会回答正则表达式;如果你问他最害怕什么,除了繁琐的安装配置外他肯定会说正则表达式。正如上面说的,正则表达式看起来非常复杂,让人害怕,大多数的PHP初学者都会跳过这里,继续下面的学习,但是PHP中的正则表达式有着可以利用模式匹配找到符合条件的字符串、判断字符串是否合乎条件或者用指定的字符串来替代符合条件的字符串等强大的功能,不学实在太可惜了……正则表达式正则表达式是一个非常大的题目,Perl的正则表达式的强大是闻了名的。而PHP也不弱,他继承了Perl的正则表达式法则,还有自己的一套法则。这里只说PHP自己的正则表达式。正则表达式是最基本的元素。简单地说就是一套规则,用于去判定其它的元素是不是符合自身的规则,或者说是不是有相同的特征描述。正则表达式的开始符:^,结尾符$,这两个符号间的是匹配的元素。如检查一个电话号码是不是打往北京的号,用正则表达式表示就是“^010$”。只要前3位区号是010,就是北京的号,后面的电话号码就不用管了。然后,用正则表达式匹配函数ereg来判断,例:?php$pattern=^010$;$phone=01080718828;if(ereg($pattern,$phone))echo打往北京的号;elseecho不是打往北京的号;?这就是正则表达式。北京的电话都是8位数字的,那我要知道这个号码是不是正确了?假如他按了9位号呢?如果判断正误?这就要用到正则表达式的字符簇。那么上例的正则表达式就要这样写:^010[0-9]{8}$,就能同时判断号码是不是符合规则。正则表达式有很多的应用,像LBB、VBB论坛在发贴时的所谓VBB代码LBB代码的解析,都是用正则表达式完成的。什么是正则表达式?你对从一个不错的老的基于控制的文本编辑器中分离出像BBEdit和notepad的程序,有什么看法呢?两个都支持文本输入,可以让你保存文本到文件中,但是现在的文本编辑器也支持其它功能,包括查找–代替工具,这让编辑一个文本文件相当容易。正则表达式也是相似的,只是更好一些。正则表达式可以被认为一个极其高级的查找-替换工具,让我们从痛苦中摆脱出来:不必再写定制的数据确认例子来检查电子邮件地址或者来确认电话号码的格式是正确的,如此等等。任何程序中最普通的函数之一就是数据有效性检查,PHP捆绑了一些文本检查函数,允许我们用正则表达式匹配一个字符串,确认有一个空格,有一个问号,等等。你不知道的可能是,正则表达式可以简单装备吗,当你掌握了一些正则表达式时(这个正则表达式可以用来告诉正则表达式引擎一个字符串中我们想要匹配的部分),你会自问为什么会把正则表达式扔到角落里这么久,^_^。PHP有两套函数,用来处理两种类型的正则表达式:Perl5兼容模式,和Posix标准兼容模式。在这篇文章中我们将看看ereg函数,用遵照Posix标准的搜索表达式工作。虽然它们并没有Perl5模式那样强大,但是一种不错的学习正则表达式的方法。如果你对PHP支持的Perl5兼容正则表达式感兴趣,可以到PHP.net网站找一些关于preg函数的细节。PHP有六个函数来处理正则表达式,它们都把一个正则表达式作为它们的第一个参数,列出如下:ereg:最常用的正则表达式函数,ereg允许我们搜索跟一个正则表达式匹配的一个字符串.ereg_replace:允许我们搜索跟正则表达式匹配的一个字符串,并用新的字符串代替所有这个表达式出现的地方。eregi:和ereg几乎是一样效果,不过忽略大小写。eregi_replace:和ereg_replace有着一样的搜索-替换功能,不过忽略大小写.split:允许我们搜索和正则表达式匹配的字符串,并且以字符串集合的方式返回匹配结果.spliti:split函数忽略大小写的版本.为什么使用正则表达式?如果你不断地建立不同的函数来检查或者操作字符串的一部分,现在你可能要放弃所有的这些函数,取而代之的用正则表达式。如果你对下列的问题都答“是的”,那么你肯定要考虑使用正则表达式了:你是否正在写一些定制的函数来检查表单数据(比如在电子信箱地址中的一个@,一个点)?你是否写一些定制的函数,在一个字符串中循环每个字符,如果这个字符匹配了一个特定特征(比如它是大写的,或者它是一个空格),那么就替换它?除了是令人不舒服的字符串检查和操作方法,如果没有有效率地写代码,上述的两条也会使你的程序慢下来。你是否更倾向于用下面的代码检查一个电子信箱地址呢:?phpfunctionvalidateEmail($email){$hasAtSymbol=strpos($email,@);$hasDot=strpos($email,.);if($hasAtSymbol&&$hasDot)returntrue;elsereturnfalse;}echovalidateEmail(mitchell@devarticles.com);?...或者使用下面的代码:?phpfunctionvalidateEmail($email){returnereg(^[a-zA-Z]+@[a-zA-Z]+\.[a-zA-Z]+$,$email);}echovalidateEmail(mitchell@devarticles.com);?可以肯定的是,第一个函数比较容易,而且看起来结构也不错。但是如果我们用上面的下一个版本的email地址检查函数不是更容易吗?上面展示的第二个函数只用了正则表达式,包括了对ereg函数的一个调用。Ereg函数返回true或者false,来声明它的字符串参数是否和正则表达式相匹配。很多编程者避开正则表达式,只因为它们(在一些情况下)比其它的文本处理方法更慢。正则表达式可能慢的原因是因为它们涉及把字符串在内存中拷贝和粘贴,因为正则表达式的每一个新的部分都对应匹配一个字符串。但是,从我对正则表达式的经验来说,除非你在文本中几百个行运行一个复杂的正则表达式,否则性能上的缺陷都可以忽略不计,当把正则表达式作为输入数据检查工具时,也很少出现这种情况。正则表达式语法在你可以匹配一个字符串到正则表达式之前,你必须先建立正则表达式。开始的时候,正则表达式的语法有点古怪,表达式中的每一个短语代表某个类型的搜索特征。下列是一些最普通的正则表达式,也都对应着一个如何使用它的例子:字符串头部搜索一个字符串的头部,用^,例如?phpechoereg(^hello,helloworld!);?将返回true,但是?phpechoereg(^hello,isayhelloworld);?将返回false,因为hello不在字符串”Isayhelloworld”的头部。字符串尾部搜索字符串尾部,用$,例如:?phpechoereg(bye$,goodbye);?将返回true,但是?phpechoereg(bye$,goodbyemyfriend);?将返回false,因为bye不在字符串”goodbyemyfriend”的尾部.任意的单个字符搜索任意字符,用点(.),例如:?phpechoereg(.,cat);?将返回true,但是?phpechoereg(.,);?将返回false,因为我们的要搜索字符串没有包含字符。你可以用花括号随意告诉正则表达式引擎它要匹配多少个单个字符。如果我只想匹配5个字符,我可以这样用ereg:?phpechoereg(.{5}$,12345);?上面的这段代码告诉正则表达式引擎当且仅当至少5个连续的字符出现字符串的尾部时返回true.我们也可以限制连续出现的字符的数目:?phpechoereg(a{1,3}$,aaa);?在上面的例子里,我们已经告诉正则表达式引擎,我们的搜索字符串来匹配表达式,它在尾部必须有介于1和3个的”a”字符。?phpechoereg(a{1,3}$,aaab);?上面的例子将不会返回true,虽然有三个”a”字符在搜索字符串里,但是它们不是在字符串的尾部。如果我们把结尾字符串匹配$从正则表达式中去掉,那么这个字符串是匹配的。我们也可以告诉正则表达式引擎来匹配至少有确定数目的字符在一行,如果它们存在的,可以匹配更多。我们可以这样做:?phpechoereg(a{3,}$,aaaa);?零或多次重复字符为了告诉正则表达式引擎一个字符可能存在,也可以重复,我们用*字符。这里的两个例子都将返回true.?phpechoereg(t*,tom);??phpechoereg(t*,fom);?即使第二个例子不包含”t”这个字符,但仍旧返回ture,因为*表示字符可以出现,但不是必须出现。事实上,任何普通的字符串模式都会使上面的ereg调用返回true,因为’t’字符是可选的.一或多次重复字符为了告诉正则表达式引擎一个字符必须存在,也可以重复不止一次,我们用+字符,像?phpechoereg(z+,ilikethezoo);?下面的例子也会返回true:?phpechoereg(z+,ilikethezzzzzzoo!);?零或一次重复字符我们也可以告诉正则表达式引擎,一个字符必须是或者只存在一次,或者没有。我们用?字符来做这项工作,就像?phpechoereg(c?,catsarefuzzy);?如果我们愿意,我们完全可以从上面的搜索字符串中删除’c’,这个表达式会仍旧返回true.’?’的意思是一个’c’可以出现在搜索字符串的任何地方,但不是必须的。正则表达式语法(续)空格字符为了匹配一个搜索字符串中的空格字符,我们用预定义Posix的类,[[:space]].方括号标明连续字符的相关性,”:space:”是实际要匹配的类(在这种情形下,是任何空白字符)。空白包括tab字符,新行字符,空白字符。或者,如果搜索字符串必须包含只有一个空格,而不是一个tab或者新行字符,你可以用一个空格字符()。在大多数情况下,我倾向于使用:space:,因为这意味着我的意图不仅仅是单个空格字符,这点很容易被忽视。这里有一些Posix-标准预定义类,有一些我们可以作为正则表达式的部分的一些Posix-标准预定义类,包括[:alnum:],[:digit:],[:lower:]等等。完整的列表可以在这里查看我们可以像这样匹配单个空白字符:?phpechoereg(Mitchell[[:space:]]Harper,MitchellHarper);?我们也可以通过在表达式后用?字符来告诉正则表达式引擎匹配没有空白或者一个空白。?phpechoereg(Mitchell[[:space:]]?Harper,MitchellHarper);?模式分组相关的模式可以在方括号里分在一起。很容易用[a-z]和[A-Z]指定只有一个小写字母或者一列大写字母以搜索字符串的一部分存在。?php//要求从第一个到最后一个都是小写字母echoereg(^[a-z]+$,johndoe);//返回true?或者像?php//要求从第一个到最后一个都是大写字母ereg(^[A-Z]+$,JOHNDOE);//返回true??我们也可以告诉正则表达式引擎,我们希望或者是小写字母,或者是大写字母。我们只要把[a-z]和[A-Z]模式结合在一起就可以做到。?phpechoereg(^[a-zA-Z]+$,JohnDoe);?在上面的例子里,如果我们能匹配JohnDoe,而不是JohnDoe,将是非常有意义的。我们用下面的正则表达式来做这个:^[a-zA-Z]+[[:space:]]{1
本文标题:php正则表达式资料整理,资料齐全适合新手学习,老手快速查阅
链接地址:https://www.777doc.com/doc-5099165 .html