1 / 26

第 8 章 正则表达式

第 8 章 正则表达式. 正则表达式应用范围很广泛,不仅 PHP 脚本支持正则表达式,类似 JavaScript 这类的客户端脚本,也提供了对正规表示式的支持。正则表达式是一种用于模式匹配和替换的表达式,主要用于复杂的字符串操作。本章主要介绍 PHP 中,关于正则表达式的函数,以及其在实际应用中的例子。. 8.1 POSIX 扩展正则表达式函数. 在 PHP 中,关于正则表达式的函数不多,但是足以满足对复杂字符串操作的需要。本节主要介绍正则表达式的基础知识和相关函数使用方法。. 8.1.1 正则表达式基础.

gent
Download Presentation

第 8 章 正则表达式

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第8章 正则表达式 • 正则表达式应用范围很广泛,不仅PHP脚本支持正则表达式,类似JavaScript这类的客户端脚本,也提供了对正规表示式的支持。正则表达式是一种用于模式匹配和替换的表达式,主要用于复杂的字符串操作。本章主要介绍PHP中,关于正则表达式的函数,以及其在实际应用中的例子。

  2. 8.1 POSIX扩展正则表达式函数 • 在PHP中,关于正则表达式的函数不多,但是足以满足对复杂字符串操作的需要。本节主要介绍正则表达式的基础知识和相关函数使用方法。

  3. 8.1.1 正则表达式基础 • 在介绍正则表达式之前,先对正则表达式的语法做一下了解。不同的脚本语言,正则表达式的表示方法略有不同,本小节以PHP作为标准。 • 首选正则表达式是一个字符串,在这个字符串内,可以设定一些规则,当正则表达式函数使用这些规则时,就可以根据已经设定好的内容,对指定的字符串进行替换或匹配的操作。 • 作为进一步的了解,下面列出几个简单的正则表达式。 • "\d{6}":表示一个由6位数字组成的字符串。 • " [A-Za-z0-9]":匹配所有大写字母、小写字母及0到9的数字。 • "^open":表示以open开始的字符串。 • "something$":表示以something结尾的字符串。 • "^[a-zA-Z]":表示一个以字母开头的字符串。 • "go{2}":表示字母g后面跟着2个o即:goo。

  4. 8.1.2 正则表达式替换 • ereg_replace()与str_replace()函数一样,都可以把字符串中查找到的子字符串,替换为指定的字符串,而ereg_replace()函数,还可以使用正则表达式来查找和替换,实现更复杂的字符串操作。下面演示ereg_replace()函数的使用方法,代码如清单所示。 • 清单 ereg_replace()函数的使用方法 • <?php • //简单的替换 • $year = "2008"; • $string = "北京将于二零零八年举办奥运会"; • //使用ereg_replace()函数替换字符串 • echo ereg_replace("二零零八",$year,$string)."<br/>"; • echo ereg_replace ("()二零零八", "\\12008", $string)."<br/>"; • echo ereg_replace ("(()二零零八)", "\\22008", $string)."<br/>"; • echo ereg_replace ("((())二零零八)", "\\32008", $string)."<br/>"; • //以下情况是非法的 • echo ereg_replace ("((())二零零八)", "\\42008", $string)."<br/>";//参数2中指定的子字符串数大小括号的嵌套数 • ?>

  5. 8.1.3 正则表达式匹配 • 使用ereg()函数,可以查找字符串与子字符串匹配的情况,并返回匹配字符的长度,还可以借助参数把返回匹配字符的数组。下面演示ereg函数的使用方法,代码如清单所示。

  6. 8.1.4 不区分大小写的正则表达式替换 • eregi_replace()与ereg_replace()一样,都可用于正则表达式的替换,唯一的区别在于,eregi_replace()函数会忽略要操作字符串中字母的大小写。下面演示eregi_replace()函数的使用方法,代码如清单所示。 • 清单 eregi_replace()函数的使用方法 • <?php • //定义一个包含有大小写字母的字符串 • $string = "beijing 2008 BeiJing"; • echo "使用ereg_replace()函数替换beijing字符串:<br>"; • $string = ereg_replace("(beijing)","<b>\\1</b>",$string); • echo $string; • echo "<br>"; • echo "<br>使用eregi_replace()函数替换beijing字符串:<br>"; • $string = eregi_replace("(beijing)","<b>\\1</b>",$string); • echo $string; • ?>

  7. 8.1.5 不区分大小写的正则表达式匹配 • eregi()与ereg ()一样,都可用于正则表达式的匹配,唯一的区别在于,eregi ()函数会忽略要操作字符串中字母的大小写。下面演示eregi ()函数的使用方法,代码如清单所示。 • 清单 eregi ()函数的使用方法 • <?php • //定义一个包含有大小写字母的字符串 • $string = "AAbbBcDDeeEE"; • if(ereg("abcde","ABCDE",$array)){ • echo "<b>使用ereg()查找匹配的字符串</b><br>"; • print_r($array); • } • if(eregi("abcde","ABCDE",$array)){ • echo "<b>使用eregi()查找匹配的字符串</b><br>"; • print_r($array); • } • ?>

  8. 8.1.6 使用正则表达式分割数组 • 使用split()函数,不仅可以完成与explode()函数同样的功能,而且还可以根据给出的正则表达式,来分割字符串,并返回一个数组。下面演示split()函数的使用方法,

  9. 8.1.7 用正则表达式不区分大小写将字符串分割到数组中 • spliti()与split()一样,都可以根据正则表达式,来分割字符串,唯一的区别在于,spliti ()函数会忽略要操作字符串中字母的大小写。下面演示spliti ()函数的使用方法,代码如清单所示。 • 清单 spliti()函数的使用方法 • <?php • //定义一个包含有大小写字母的字符串 • $string = "AAbbBcDDeeEE"; • if(ereg("abcde","ABCDE",$array)){ • echo "<b>使用ereg()查找匹配的字符串</b><br>"; • print_r($array); • } • if(eregi("abcde","ABCDE",$array)){ • echo "<b>使用eregi()查找匹配的字符串</b><br>"; • print_r($array); • } • ?>

  10. 8.1.8 产生不区分大小匹配的正则表达式 • 使用sql_regcase()函数,可以根据参数的字符串,产生一个不区分大小写的正则表达式。这大大减少了在脚本中,建立字符匹配正则表达式的时间。下面演示sql_regcase()函数的使用方法,代码如清单所示。

  11. 8.2 PERL兼容正则表达式函数 • PERL兼容正则表达式函数,使用的模式类似于Perl中的语法。其表达式应包含在定界符中,除数字、字母、反斜线外的任务字符,都可以做字界符使用,如果作为定界符的字符要出现在表达式中,可以使用反斜线进行转。

  12. 8.2.1 返回与模式匹配的数组单元 • 使用preg_grep()函数,可以根据给定的字符或正则表达式,查找指定数组,并返回与查找条件匹配的单元。下面演示preg_grep()函数的使用方法,代码如清单所示。

  13. 8.2.2 正则表达式匹配 • 使用preg_match()函数,可以查找字符串与子字符串匹配的情况,并返回匹配字符的长度,还可以借助参数把返回匹配字符的数组。下面演示preg_match()函数的使用方法,代码如清单所示。

  14. 8.2.3 全局正则表达式匹配 • preg_match_all()函数可以在字符串中搜索,与给出的正则表达式匹配的内容,并将结果按指定的顺序放到数组中。preg_match_all()与preg_match()函数的作用都是一样的,其区别在于,preg_match()函数在搜索到第1个字符匹配后,将停止搜索。而preg_match_all()函数在搜索到第1个匹配后,会从第1个匹配项后继续搜索,依次类推,直到搜索完整个字符串。下面演示preg_match_all()函数的使用方法,代码如清单所示。

  15. 8.2.4 转义正则表达式字符 • 当在正则表达式中使用特列符号时,需要对这些特殊符号进行转义。使用preg_quote()函数,可以对指定的字符串的中特殊字符,自动进行转义操作,这些字符包括:“.、\、+、*、?、[、^、]、$、(、)、{、}、=、!、<、>、|、:”。 • preg_quote()函数,不仅可以用于转义正则表达式的特殊字符,也可以为字符串中的特殊字符加上反斜线。下面演示preg_quote()函数的使用方法,代码如清单所示。

  16. 8.2.5 正则表达式的搜索和替换 • 使用preg_replace()函数,可以在字符串中搜索,与正则表达式匹配的项,并替换为一个指定的字符串。preg_replace()函数默认替换所有匹配项,也可以使用参数控制替换的匹配项。preg_replace()函数与ereg_replace()函数,实现的功能是一样的,下面特别演示preg_replace()函数将HTML转换为文本的方法, • preg_replace()函数有4个参数: • 第1个参数是必选参数,用于指定要查找的字符或正则表达式。 • 第2个参数是必选参数,用于指定替换匹配项的字符串。 • 第3个参数是必选参数,用于指定要查找的字符串。 • 第4个参数是可选参数,当使用该参数后,preg_replace()函数会根据这个参数的值,替换个数的匹配项。

  17. 8.2.6 用正则表达式分割字符串 • 使用preg_split()函数,将返回一个数组,数组的每个单元是使用正则表达式作为边界,分割出的子字符串。preg_split()函数还可以设定返回数组单元的个数。下面演示preg_split()函数的使用方法,代码如清单所示。

  18. 8.3 正则表达式应用实例 • 正则表达式主要应用在复杂字符串操作中,最经常使用的是检验某类特殊字符串,如:电子邮件地址、IP地址、邮政编码等。本节将介绍正则表达式的应用实例,并列出部分常用正则表达式供读者参考。

  19. 8.3.1 正则表达式的应用 • 正则表达式的应用很广泛,特别是在一些复杂字符串操作时,使用正则表达式,将会变得非常简单。下面简单演在PHP中使用正则表达式的方法, • 定义了一个用于检查电子邮件地址的函数,其核心语句是ereg()函数。电子邮件地址的命名规则是:以字母、数字、下划线及中划线开头,后跟“@”符号,其后跟字母、数字、下划线及中划线组成的字符串,其后跟“.”符号,其后跟字母、数字、下划线及中划线组成的字符串,使用正则表达式表示就是:^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+。 • 在建立与电子邮件地址相匹配的正则表达式后,就可以使用ereg()函数来对模式与字符串进行匹配,如果相匹配就是正确的电子邮件地址,如果不匹配就是非法邮件地址。

  20. 8.3.2 匹配特定数字 • 正则表达式可以用于数字的匹配,下面演示特定数字的正则表达式的方法,代码如清单所示。

  21. 8.3.3 匹配特定字符串 • 正则表达式一个重要的作用就是,处理复杂的字符串,而字符串匹配,主要是针对26个英文字母来进行的。下面演示匹配特定字符串的正则表达式,代码如清单所示。

  22. 8.3.4 常用正则表达式 • 除了用于匹配特定数字和字符外,下面列出一些常用的正则表达式,供读者参考,演示代码如清单所示。

  23. 8.4 常见问题 • 正则表达式可以处理很复杂的字符串,但是其语法相对来说也是比较复杂,在学习正则表达式时,注意多参考例子。由于正则表达式函数实现的功能,有一些字符串函数也可以实现,所以在实际应用中,应该根据实际情况选择使用。

  24. 8.4.1 关于正则表达式的语法 • 在本章中,介绍了正则表达式的相关语法,其中主要语法都可以在表8-1中查找。表8-1中的正则表达式语法,包括了POSIX扩展与PERL兼容两种正则表达式的语法,在使用时要注意,POSIX扩展正则表达式函数,不支持类似的表达式:\d、\w等。 可以通过一段代码,来演示两类函数正则表达式语法的区别,代码如下所示。 • <?php • //定义一个字符串,存储一个网址 • $url = "http://www.rzphp.com"; • //使用POSIX扩展正则表达式函数把网址转化为一个连接 • echo ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]", "<a href=\"\\0\">\\0</a>",$url); • //使用PERL兼容正则表达式函数把网址转化为一个连接 • echo preg_replace("/[[:alpha:]]+:\/\/[^<>[:space:]]+[[:alnum:]\/]/", "<a href=\"\\0\">\\0</a>",$url); • ?>

  25. 8.4.2 关于字符串替换 • 正则表达式函数,如ereg_repalce()、eregi_replace()、preg_replace()函数,都可以实现字符串的替换。但并不是所有的字符串替换,都必须使用正则表达式来完成,str_replace()在完成普通的字符串替换时,比正则表达式有优势,只有在替换复杂的字符串时,正则表达式才能体现出价值。 • 在同样使用正则表达式替换字符串时,推荐使用preg_replace()函数,即PERL兼容的正则表达式函数。

  26. 8.4.3 关于正则表达式的选择 • 在本书介绍的众多函数中,有许多功能相同的函数,在实际应用时,如何选择正确的函数,直接影响到程序的执行效率等问题。 • 在处理简单的字符串时,可以选择字符串函数来完成,例如分割字符串,explode()函数就可以满足大部分的需要,如果这时使用split()或preg_split()函数,将带来不必要的效率损耗。 • 而在字符串处理函数,不能解决当前问题的情况下,可以选择使用正则表达式函数,而同样的正则表达式函数,本书推荐使用PERL兼容的正则表达式函数。

More Related