第 8 章 正则表达式

26
第8第 第第第第第 • 第第第第第第第第第第第第 第第 PHP 第第第第第第第第第 第第 Java Script 第第第第第第第第 第第第第第第第第第第第第第第 第第第第第 ,。 第第第第第第第第第第第第第第第 第第第第第第第第第第第第第 第第第第 一,。 第第 PHP 第 第第第第第第第第第第第 第第第第第第第第第第第第第 ,,。

Upload: gent

Post on 19-Jan-2016

135 views

Category:

Documents


4 download

DESCRIPTION

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

TRANSCRIPT

Page 1: 第 8 章  正则表达式

第 8 章 正则表达式

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

Page 2: 第 8 章  正则表达式

8.1 POSIX 扩展正则表达式函数

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

Page 3: 第 8 章  正则表达式

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 。

Page 4: 第 8 章  正则表达式

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 中指定

的子字符串数大小括号的嵌套数• ?>

Page 5: 第 8 章  正则表达式

8.1.3 正则表达式匹配

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

Page 6: 第 8 章  正则表达式

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;• ?>

Page 7: 第 8 章  正则表达式

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);• }• ?>

Page 8: 第 8 章  正则表达式

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

Page 9: 第 8 章  正则表达式

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);• }• ?>

Page 10: 第 8 章  正则表达式

8.1.8 产生不区分大小匹配的正则表达式

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

Page 11: 第 8 章  正则表达式

8.2 PERL 兼容正则表达式函数

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

Page 12: 第 8 章  正则表达式

8.2.1 返回与模式匹配的数组单元• 使用 preg_grep() 函数,可以根据给定的字符或正则表达

式,查找指定数组,并返回与查找条件匹配的单元。下面演示 preg_grep() 函数的使用方法,代码如清单所示。

Page 13: 第 8 章  正则表达式

8.2.2 正则表达式匹配• 使用 preg_match() 函数,可以查找字符串与子字符串匹配的情

况,并返回匹配字符的长度,还可以借助参数把返回匹配字符的数组。下面演示 preg_match() 函数的使用方法,代码如清单所示。

Page 14: 第 8 章  正则表达式

8.2.3 全局正则表达式匹配• preg_match_all() 函数可以在字符串中搜索,与给出的正则表达

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

Page 15: 第 8 章  正则表达式

8.2.4 转义正则表达式字符• 当在正则表达式中使用特列符号时,需要对这些特殊符号

进行转义。使用 preg_quote() 函数,可以对指定的字符串的中特殊字符,自动进行转义操作,这些字符包括:“ . 、\ 、 +、 *、 ? 、 [ 、 ^ 、 ] 、 $ 、 ( 、 ) 、 { 、 } 、 = 、 !、< 、 > 、 |、 :”。

• preg_quote() 函数,不仅可以用于转义正则表达式的特殊字符,也可以为字符串中的特殊字符加上反斜线。下面演示 preg_quote() 函数的使用方法,代码如清单所示。

Page 16: 第 8 章  正则表达式

8.2.5 正则表达式的搜索和替换• 使用 preg_replace() 函数,可以在字符串中搜索,与正则

表达式匹配的项,并替换为一个指定的字符串。 preg_replace() 函数默认替换所有匹配项,也可以使用参数控制替换的匹配项。 preg_replace() 函数与 ereg_replace() 函数,实现的功能是一样的,下面特别演示 preg_replace() 函数将 HTML转换为文本的方法,

• preg_replace() 函数有 4 个参数:• 第 1 个参数是必选参数,用于指定要查找的字符或正则表

达式。• 第 2 个参数是必选参数,用于指定替换匹配项的字符串。• 第 3 个参数是必选参数,用于指定要查找的字符串。• 第 4 个参数是可选参数,当使用该参数后, preg_replace

() 函数会根据这个参数的值,替换个数的匹配项。

Page 17: 第 8 章  正则表达式

8.2.6 用正则表达式分割字符串• 使用 preg_split() 函数,将返回一个数组,数组的每个单元是使

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

Page 18: 第 8 章  正则表达式

8.3 正则表达式应用实例

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

Page 19: 第 8 章  正则表达式

8.3.1 正则表达式的应用• 正则表达式的应用很广泛,特别是在一些复杂字符串操作

时,使用正则表达式,将会变得非常简单。下面简单演在 PHP 中使用正则表达式的方法,

• 定义了一个用于检查电子邮件地址的函数,其核心语句是 ereg() 函数。电子邮件地址的命名规则是:以字母、数字、下划线及中划线开头,后跟“@”符号,其后跟字母、数字、下划线及中划线组成的字符串,其后跟“ .”符号,其后跟字母、数字、下划线及中划线组成的字符串,使用正则表达式表示就是: ^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+。

• 在建立与电子邮件地址相匹配的正则表达式后,就可以使用 ereg() 函数来对模式与字符串进行匹配,如果相匹配就是正确的电子邮件地址,如果不匹配就是非法邮件地址。

Page 20: 第 8 章  正则表达式

8.3.2 匹配特定数字

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

Page 21: 第 8 章  正则表达式

8.3.3 匹配特定字符串

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

Page 22: 第 8 章  正则表达式

8.3.4 常用正则表达式

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

Page 23: 第 8 章  正则表达式

8.4 常见问题

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

Page 24: 第 8 章  正则表达式

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);• ?>

Page 25: 第 8 章  正则表达式

8.4.2 关于字符串替换

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

• 在同样使用正则表达式替换字符串时,推荐使用preg_replace() 函数,即 PERL 兼容的正则表达式函数。

Page 26: 第 8 章  正则表达式

8.4.3 关于正则表达式的选择

• 在本书介绍的众多函数中,有许多功能相同的函数,在实际应用时,如何选择正确的函数,直接影响到程序的执行效率等问题。

• 在处理简单的字符串时,可以选择字符串函数来完成,例如分割字符串, explode() 函数就可以满足大部分的需要,如果这时使用 split() 或 preg_split() 函数,将带来不必要的效率损耗。

• 而在字符串处理函数,不能解决当前问题的情况下,可以选择使用正则表达式函数,而同样的正则表达式函数,本书推荐使用 PERL 兼容的正则表达式函数。