《PHP字符串操作与正则表达式.ppt》由会员分享,可在线阅读,更多相关《PHP字符串操作与正则表达式.ppt(63页珍藏版)》请在三一办公上搜索。
1、2,第4章 PHP字符串操作与正则表达式,字符串是PHP程序相当重要的一部分操作内容,程序传递给我们的可视化信息,绝大多数都是靠字符串来实现的。例如本书开始时的Hello World程序就是输出了一个“Hello World!”的字符串。本章将详细解释PHP中的字符串以及字符串的连接、分割、比较、查找和替换等操作。,3,4.1 字符串的定义,美国国家标准学会(American National Standard Institute,ANSI)制定了一整套可见的字符(如大写字母A)和不可见的字符(如回车符、退格符等控制字符),共127个字符。由零个或者多个字符组成的有限序列,也就是n(n0)个字
2、符的集合,叫做字符串。在书写上,字符串一般都写在成对的单引号或者双引号中。例如:我的新闻网;/*一个由HTML代码组成的字符串,单引号中嵌套成对使用的双引号*/?,4,4.2 字符串的格式化,在程序运行的过程中,字符串往往并不是以我们所需要的形式出现的,此时,就需要对该字符串进行格式化处理,如删除字符串中多余的空格。,5,4.2.1 字符串整理:chop()、ltrim()和trim(),1.chop()函数语法:string chop(string$str,string$charlist)函数作用:去除字符串尾部的空格等特殊字符,如果指定了第2个参数,则去除字符串尾部中的由第2个参数指定的字
3、符。函数例程:,6,4.2.1 字符串整理:chop()、ltrim()和trim(),2.ltrim()函数语法:string ltrim(string$str,string$charlist)函数作用:去除字符串头部的空格等特殊字符,如果指定了第2个参数,则去除字符串头部中的由第2个参数指定的字符。函数例程:,7,4.2.1 字符串整理:chop()、ltrim()和trim(),3.trim()函数语法:string trim(string$str,string$charlist)函数作用:去除字符串头部和尾部的空格等特殊字符,如果指定了第2个参数,则去除字符串头部和尾部中的由第2个参数
4、指定的字符。函数例程:,8,4.2.2 addslashes()和stripslashes(),1.addslashes()函数语法:string addslashes(string str)函数作用:使用反斜线引用字符串。函数例程:,9,4.2.2 addslashes()和stripslashes(),2.stripslashes()stripslashes()函数与addslashes()相反,是把被addslashes()函数加上的转义符取消。函数语法:string stripslashes(string)函数例程:,10,4.2.3 字符串的大小写转换,1.strtoupper()函
5、数语法:string strtoupper(string$string)函数说明:将字符串string的字母全部以大写字母的形式返回。函数例程:,11,4.2.3 字符串的大小写转换,2.strtolower()函数语法:string strtolower(string$string)函数说明:将字符串string的字母全部以小写字母的形式返回。函数例程:,12,4.3 字符串的连接和分割,在PHP程序设计过程中,经常需要定义各种各样的字符串以供使用,就会碰到多个字符串合并或者将一个大字符串分割成为几个子字符串的应用需求。我们已经知道可以用“.”运算符来连接多个字符串成为一个新的字符串。本节要
6、反其道而行之,将学习如何把一个字符串分割成多个子字符串。,13,4.3.1 使用explode()、implode()和join(),1.explode()函数语法:array explode(string$separator,string$string,int$limit)函数作用:将字符串$string用$separator来分割,每出现一次$separator,就多出一个由两个$separator之间的字符组成的字符串元素,函数最后的返回值是一个数组。如果使用了第3个参数$limit,则函数返回的数组最多包含$limit个元素,剩余未被分割的字符串作为最后一个元素。函数实际使用时,最常见
7、的$separator是空格或者“|”、“,”。函数例程:参见教材P71,14,4.3.1 使用explode()、implode()和join(),2.implode()和join()函数语法:string implode(string$glue,array$pieces)函数作用:把数组的各元素合成为一个用$glue连接起来的字符串。函数例程:,15,4.3.2 使用strtok()函数,函数语法:string strtok(string$str,string$token)函数作用:字符串$str用字符串$token的值切开成小段小段的字符串,返回$token第一次出现前的部分子字符串,如
8、果重复执行该函数,则不再需要$str参数,将依次返回后续的下一个$token出现前的部分子字符串。函数例程:;$tok=strtok();/只有第一次调用strtok()函数时需要使用$string参数/*输出:单词=I单词=like单词=this单词=game*/?,16,4.3.3 使用substr()函数,函数语法:string substr(string$string,int$start,int$length)函数作用:取得字符串$string从$start开始的$length长度的子字符串,如果没有$length参数,则取到$string的最后一个字符。函数例程:,17,4.4 字符
9、串的比较,在现实生活中,我们经常按照姓氏笔划的多少或者拼音顺序来给多人排序,26个英文字母和10个阿拉伯数字也能按照从小到大或者从大到小的规则进行排序,在程序设计中,由字母和数字组成的字符串,同样可以按照指定的规则来排列顺序。PHP提供了strcmp()、strcasecmp()和strnatcmp()几个函数来对字符串进行排序比较。,18,4.4.1 字符串的排序:strcmp()、strcasecmp()和strnatcmp(),1.strcmp()函数语法:int strcmp(string$str1,string$str2)函数说明:本函数用来比较两个字符串的大小。返回负数表示str1
10、小于str2;返回正数表示str1大于str2;返回零表示两个字符串相同。函数例程:,19,4.4.1 字符串的排序:strcmp()、strcasecmp()和strnatcmp(),2.strcasecmp()函数语法:int strcasecmp(string$str1,string$str2,int$len)函数说明:strcasecmp()用来比较参数str1和str2字符串,比较时会自动忽略大小写的差异。第3个参数len表示要比较的长度。函数例程:,20,4.4.1 字符串的排序:strcmp()、strcasecmp()和strnatcmp(),3.strnatcmp()函数语法
11、:int strnatcmp(string$str1,string$str2)函数说明:按照自然规则比较两个字符串的大小。返回负数表示str1小于str2;返回正数表示str1大于str2;返回零表示两个字符串相同。函数例程:,21,4.4.2 获取字符串长度,字符串是由一个或多个字符组成的,那么如何得知某个特定的字符串是由多少个字符来组成的呢?PHP提供了strlen()函数来获得字符串的长度。函数语法:int strlen(string$string)函数说明:返回字符串string的长度。函数例程:,22,4.5 字符串的查找和替换,字符串的连接、分割以及对字符串的查找和替换,是字符串应
12、用最多的操作。本节学习字符串的查找和替换。,23,4.5.1 字符串的查找:strstr()、stristr()和strrchr(),1.strstr()函数语法:string strstr(string$haystack,string$needle,bool$before_needle)函数说明:在字符串haystack中查找子字符串needle第一次出现的位置,并返回字符串haystack中从字符串needle开始到母字符串结束的部分。如果参数before_needle为true,则返回字符串haystack中从开始到字符串needle第一次出现位置之间的字符串。函数例程:,24,4.5.
13、1 字符串的查找:strstr()、stristr()和strrchr(),2.stristr()函数语法:string stristr(string$haystack,string$needle,bool$before_needle)函数说明:同strstr(),不同之处为本函数不区分大小写。函数例程:,25,4.5.1 字符串的查找:strstr()、stristr()和strrchr(),3.strrchr()函数语法:string strrchr(string$haystack,string$needle)函数说明:本函数用来寻找字符串haystack中的字符needle最后一次出现的
14、位置,并返回此位置起至字符串haystack结束之间的字符串。若没有找到needle则返回false。函数例程:,26,4.5.2 查找子字符串的位置:strpos()、strrpos(),1.strpos()函数语法:int strpos(string$haystack,mixed$needle,int$offset)函数说明:寻找字符串haystack中的字符needle最先出现的位置。值得注意的是needle只能是一个字符,中文字等就不适合了。若找不到指定的字符,则返回false值。参数offset可省略,用来表示从offset位置处开始找。函数例程:,27,4.5.2 查找子字符串的位
15、置:strpos()、strrpos(),2.strrpos()函数语法:int strrpos(string$haystack,string$needle,int$offset)函数说明:与strpos()略同,不同之处是查找并返回needle最后一次出现的位置。函数例程:,28,4.5.2 查找子字符串的位置:strpos()、strrpos(),3.其他函数语法:int stripos(string$haystack,string$needle,int$offset)函数说明:同strpos(),忽略大小写。函数语法:int strripos(string$haystack,string
16、$needle,int$offset)函数说明:同strrpos(),忽略大小写。,29,4.5.3 字符串的替换:str_replace()、substr_replace(),1.str_replace()函数语法:mixed str_replace(mixed$search,mixed$replace,mixed$subject,int/输出首页?,30,4.5.3 字符串的替换:str_replace()、substr_replace(),2.substr_replace()函数语法:mixed substr_replace(mixed$string,string$replacement
17、,int$start,int$length)函数说明:在原字符串string从start开始的位置开始替换为replacement。开始替换的位置应该小于原字符串的长度,可选参数length为要替换的长度。函数例程:,31,4.6 字符串的加密和编码,为了保护敏感的内容,我们通常将其加密存储,PHP提供了多个加密函数,最常用的是MD5散列加密。,32,4.6.1 字符串的MD5加密,函数语法:string md5(string$str,bool$raw_output)函数说明:返回字符串str的MD5散列值。函数例程:,33,4.6.2 字符串的编码,1.urlencode()函数语法:str
18、ing urlencode(string$str)函数说明:将字符串str按照URL方式编码,除了“-”、“_”和“.”之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。函数例程:,34,4.6.2 字符串的编码,2.urldecode()函数语法:string urldecode(string$str)函数说明:解码给出的已编码字符串中的任何%#。返回解码后的字符串。函数例程:,35,4.6.2 字符串的编码,3.base64_encode()函数语法:string base64_encode(string$data)函数说明:返回使用base64对
19、data进行的编码。设计此种编码是为了使二进制数据可以通过非纯8-bit的传输层传输,例如电子邮件的主体。Base64-encoded数据要比原始数据多占用33%左右的空间。函数例程:,36,4.6.2 字符串的编码,4.base64_decode()函数语法:string base64_decode(string$encoded_data)函数说明:针对encoded_data进行解码,返回原始数据,失败则返回false。函数例程:,37,4.7 正则表达式简介,正则表达式是一种可以用于模式匹配和替换的强有力的工具。正则表达式可以让用户通过使用一系列的特殊字符构建匹配模式,然后把匹配模式与数
20、据文件、程序输入以及Web页面的表单输入等目标对象进行比较,根据比较对象中是否包含匹配模式,执行相应的程序。正则表达式的使用,可以通过简单的办法来实现强大的功能。通俗地讲,正则表达式(Regular Expression)就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征。,38,4.7 正则表达式简介,正则表达式的用途非常广泛,如:验证字符串是否符合指定特征用来查找字符串用来替换,比普通的替换更强大。正则表达式是由普通字符(例如字符a到z)以及特殊字符(称为元字符)组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。正则表达式的组件可以
21、是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。,39,4.7.1 普通字符,普通字符由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母、所有数字、所有标点符号以及其他一些符号。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。如表达式“c”,在匹配字符串“abcde”时成功;匹配到的内容是“c”;匹配到的位置开始于2,结束于3。再如,表达式“bcd”,在匹配字符串“abcde”时成功;匹配到的内容是“bcd”;匹配到的位置开始于1,结束于4。,40,4.7.2 非打印字符,非打印字符如表4-1所示。,41,4.7.3 特
22、殊字符,所谓特殊字符,就是一些有特殊含义的字符,如通常用“*”表示任何字符串。正则表达式的特殊字符如表4-2所示。,42,4.7.4 限定符,限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配条件。有*、+、?、n、n,、n,m,共6种。正则表达式的限定符如表4-3所示。,43,4.7.5 定位符,定位符用来描述字符串或单词的边界,共有4个,如表4-4所示。,44,4.7.6 选择,用圆括号将所有选择项括起来,相邻的选择项之间用“|”分隔。但用圆括号会有一个副作用,是相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用。其中?:是非捕获元之一,还有两个非捕获元是?=
23、和?!,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。,45,4.7.7 后向引用,对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储。存储子匹配的缓冲区编号从1开始,连续编号直至最大99个子表达式。每个缓冲区都可以使用n访问,其中n为一个标识特定缓冲区的一位或两位十进制数。可以使用非捕获元字符?:、?=或?!来忽略对相关匹配的保存。,46,4.7.8 几个正则表达式匹配的
24、例子,(1)表达式“(|”)(.*?)(1)”在匹配“Hello,“World”时成功,匹配到的内容是“Hello”。再次匹配时可以匹配到“World”(注意程序中引号均无方向)。(2)表达式“(w)14,”在匹配“aa bbbb abcdefg ccccc 111121111 999999999”时成功;匹配到的内容是“ccccc”。再次匹配时,将得到 999999999。这个表达式要求“w”范围的字符至少重复5次,注意与“w5,”之间的区别。(3)表达式“.*?”在匹配“”时成功。如果“”与“”不配对,则会匹配失败;如果改成其他配对,也可以匹配成功。,47,4.7.8 几个正则表达式匹配的
25、例子,(4)“The”:表示所有以“The”开始的字符串(“There”和“The cat”等)。(5)“of despair$”:表示所有以“of despair”结尾的字符串。(6)“abc$”:表示开始和结尾都是“abc”的字符串。(7)“notice”:表示任何包含“notice”的字符串。(8)*、+和?这三个符号,表示一个或一序列字符重复出现的次数。它们分别表示“没有或更多”、“一次或更多”及“没有或一次”。(9)用大括号表示重复次数的范围。(10)|表示“或”操作。(11).可以替代任何字符。(12)方括号表示某些字符允许在一个字符串中的某一特定位置出现。,48,4.7.9 常用
26、的正则表达式,(1)非负整数:d+$(2)正整数:0-9*1-90-9*$(3)非正整数:(-d+)|(0+)$(4)负整数:-0-9*1-90-9*$(5)整数:-?d+$(6)非负浮点数:d+(.d+)?$(7)正浮点数:(0-9)+.0-9*1-90-9*)|(0-9*1-90-9*.0-9+)|(0-9*1-90-9*)$(8)非正浮点数:(-d+.d+)?)|(0+(.0+)?)$(9)负浮点数:(-(正浮点数正则式)$(10)英文字符串:A-Za-z+$(11)英文大写串:A-Z+$(12)英文小写串:a-z+”(13)英文字符数字串:A-Za-z0-9+$(14)英数字加下划线串
27、:w+$(15)E-mail地址:w-+(.w-+)*w-+(.w-+)+$(16)URL:a-zA-Z+:/(w+(-w+)*)(.(w+(-w+)*)*(?s*)?$,49,4.7.10 其他注意事项,(1)如果要求表达式所匹配的内容是整个字符串,而不是从字符串中找一部分,那么可以在表达式的首尾使用“”和“$”,例如“d+$”要求整个字符串只有数字。(2)如果要求匹配的内容是一个完整的单词,而不会是单词的一部分,那么在表达式首尾使用“b”,例如使用“b(if|while|else|void|int.)b”来匹配程序中的关键字。(3)表达式不要匹配空字符串。(4)能匹配空字符串的子匹配不要循
28、环无限次。(5)合理选择贪婪模式与非贪婪模式。(6)或“|”的左右两边,对某个字符最好只有一边可以匹配,这样,不会因为“|”两边的表达式因为交换位置而有所不同。(7)注意:在方括号中不需要转义字符。,50,4.8 PHP的正则表达式操作,本节将介绍PHP5中与正则表达式相关的函数。,51,4.8.1 获得与模式匹配的数组单元:preg_grep,函数语法:array preg_grep(string$pattern,array$input,int$flags)函数说明:返回一个包括了input数组中与给定的pattern模式相匹配单元的新数组。如果参数flags为PREG_GREP_INVER
29、T,则返回的是由不匹配pattern单元所组成的新数组。函数例程:ASP,选择二=PHP,选择三=JSP,选择四=JAVA,选择五=C#);$newarr=preg_grep(/P+/,$arr);print_r($newarr);/将输出:Array(选择一=ASP 选择二=PHP 选择三=JSP)$newarr=preg_grep(/P+/,$arr,PREG_GREP_INVERT);print_r($newarr);/将输出:Array(选择四=JAVA 选择五=C#)?,52,4.8.2 进行全局正则表达式的匹配:preg_match_all,函数语法:int preg_match_
30、all(string$pattern,string$subject,array$matches,int$flags)函数说明:在subject中搜索所有与pattern给出的正则表达式匹配的内容,并将结果以flags指定的顺序放到数组matches中。搜索到第一个匹配项之后,接下来的搜索从上一个匹配项末尾开始。函数例程:新浪新闻搜狐新闻网易新闻腾讯新闻;preg_match_all(/a href=(.*?)/,$html_text,$href);preg_match_all(/title=(.*?)/,$html_text,$title);print_r($href1);/*会输出:Arra
31、y(0=http:/1=http:/2=http:/3=http:/)*/print_r($title1);/*会输出:Array(0=新浪新闻 1=搜狐新闻 2=网易新闻 3=腾讯新闻)*/?,53,4.8.3 进行正则表达式的匹配:preg_match,函数语法:int preg_match(string$pattern,string$subject,array$matches,int$flags)函数说明:在subject字符串中搜索与pattern给出的正则表达式相匹配的内容。函数例程:新浪新闻搜狐新闻网易新闻腾讯新闻;preg_match(/a href=(.*?)/,$html_t
32、ext,$href);preg_match(/title=(.*?)/,$html_text,$title);print_r($href1);/将输出:http:/print_r($title1);/将输出:新浪新闻?,54,4.8.4 转义正则表达式字符:preg_quote,函数语法:string preg_quote(string$str,string$delimiter)函数说明:以str为参数并给其中每个属于正则表达式语法的字符前面加上一个反斜线。如果你需要以动态生成的字符串作为模式去匹配,则可以用此函数转义其中可能包含的特殊字符。如果提供了可选参数delimiter,该字符也将被转
33、义。可以用来转义PCRE函数所需要的定界符,最常用的定界符是斜线/。正则表达式的特殊字符包括.+*?$()=!|:。函数例程:,55,4.8.5 执行正则表达式的搜索和替换函数:preg_replace,函数语法:mixed preg_replace(mixed$pattern,mixed$replacement,mixed$subject,int$limit)函数说明:在subject中搜索pattern模式的匹配项并替换为replacement。如果指定了limit,则仅替换limit个匹配,如果省略limit或者其值为-1,则所有的匹配项都会被替换。函数例程:参见教材P88,56,4.8
34、.6 通过回调函数执行正则表达式的搜索 和替换preg_replace_callback,函数语法:mixed preg_replace_callback(mixed$pattern,callback$callback,mixed$subject,int$limit)函数说明:本函数的行为几乎与preg_replace()一样,除了不是提供一个replacement参数,而是指定一个callback函数。该函数将以目标字符串中的匹配数组作为输入参数,并返回用于替换的字符串。函数例程:参见教材P88,57,4.8.7 用正则表达式进行字符串分割preg_split,函数语法:array preg
35、_split(string$pattern,string$subject,int$limit,int$flags)函数说明:返回一个数组,包含subject中沿着与pattern匹配的边界所分割的子串。如果指定了limit,则最多返回limit个子串,如果limit是-1,则意味着没有限制,可以用来继续指定可选参数flags。函数例程:参见教材P89,58,4.9 正则表达式的Web验证应用,在本节中,我们根据所学到的正则表达式来应用于校验Web上的用户输入信息。,59,4.9.1 电子邮件地址的校验,程序代码如下:,60,4.9.2 多字节字符的校验,程序代码如下:,61,4.9.3 URL地址的校验,程序代码如下:,62,4.9.4 电话号码和邮政编码的校验,程序代码如下:,63,4.10 本 章 小 结,字符串是在各种编程语言中都很重要的基础知识,从掌握字符串的操作开始,可以为PHP的学习创造一个良好的开端。本章我们还学习了许多字符串操作函数。正则表达式是功能强大的模式匹配操作,本书附录中给出了正则表达式中元字符的行为列表。,