PHP正则表达式&字符串处理
- 格式:doc
- 大小:80.50 KB
- 文档页数:8
第四课:正则表达式&字符串处理程序原理:处理数据(Web上的数据)数据:类型字符串是程序中的一种最基本的类型 serialize正则就是处理字符串的一种方式处理字符串:查找、替换、删除、匹配、分割1、正则表达式简介正则表达式介绍正则表达式:Regular Expression,是用于描述字符排列模式的一种语法规则。
正则表达式是查找和替换、切割字符串模式的简洁和灵活的表示方法。
正则表达式的用途:在unix(linux)系统中,可以在编辑器中使用正则表达式实现对字符的搜索及处理;各种编程语言(c/c++,perl,java,javascript)也可以使用正则表达式实现对字符的模式分割、匹配、查找及替换操作。
正则表达式早期仅用于Unix系统程序,现在已被绝大多数系统、程序所支持。
PHP支持两种风格的正则表达式函数:一种是由PCRE(Perl Compatible Regular Expression)库提供的;另一种是由POSIX(Portable Operation System Implementation for unix,UNIX可移植操作系统实现接口)扩展库提供的。
前者使用以“preg_”为前缀命名的函数;后者使用以“ereg_”为前缀命名的函数。
两者功能相似,只是执行效率略有差异。
PERL库的函数(preg_)执行效率略高。
ereg_*相关函数在php6中将不被支持(从PHP5.3.0开始已经删除),不推荐使用。
正则语法记忆、理解PHP函数2、正则表达式的语法规则正则表达式描述了一种字符串的排列模式,主要用于字符串的模式分割、匹配、查找及替换等操作。
正则表达式是主要由原子(普通字符,如单个英文字符、数字、特殊字符等)、元字符(有特殊功用的字符)以及模式修正字符组成。
一个正则表达式中至少包含一个原子。
他们各自功能和含义有所不同,下面将分别讲述正则表达式的组成元素及其语法规则。
$content = preg_split('/<div.+page-break-after.+div>/i',$content);原子:通常是最基本一个字符。
元字符:特殊字符,比如^,$。
模式修正字符:i,m等。
9.php模式修正符:模式修正符是标记在整个模式之外的.i :模式中的字符将同时匹配大小写字母.m :字符串视为多行.s :将字符串视为单行,换行符作为普通字符.x :将模式中的空白忽略.A :强制仅从目标字符串的开头开始匹配.D :模式中的美元元字符仅匹配目标字符串的结尾.U :匹配最近的字符串.2.1普通转义字符普通转义字符是一种原子。
正则表达式所使用的普通转义字符见下表:原子说明\d匹配一个数字;等价于[0-9]\D匹配除数字以外任何一个字符;等价于[^0-9] ;\d取反\w匹配一个英文字母、数字或下划线;等价于[0-9a-zA-Z_]\W匹配除英文字母、数字和下划线以外任何一个字符;等价于[^0-9a-zA-Z_]\s匹配一个空白字符;等价于[ \f\n\r\t\v]。
包括空格。
\S匹配除空白字符以外任何一个字符;等价于[^ \f\n\r\t\v]\f 匹配一个换页符;等价于\x0c 或\cL\n匹配一个换行符;等价于\x0a 或\cJ\r匹配一个回车符;等价于\x0d 或\cM\t匹配一个制表符;等价于\x09 或\cI\v 匹配一个垂直制表符;等价于\x0b 或\cK\oNN 匹配一个八进制数字\xNN 匹配一个十六进制数字\cC 匹配一个控制字符参考1.php2.2 字符类(字符集)和范围:任何包含在方括号[]中的内容都是一个字符类——一个被匹配字符所属的字符集合。
"[]"中存放一组原子,彼此地位平等,且仅匹配其中的一个原子。
例:[abc]表示匹配a或b或c中的一个[a-z]表示所有a到z之间的字符中的一个[A-Z]匹配所有大写字母中的一个[a-zA-Z]表示任何的大小写字母中的一个[^a-z]匹配任何不在a到z之间的字符(^表示否)[0-9]匹配所有的数字 \d[0-9.-]匹配所有的数字,点号和减号注意:a.[]中的内容只表示一个字符。
被匹配的文本中只要有[]中的任何一个字符,就匹配成功。
b.当把^放在方括号里面第一个位置时,表示否;如果^在方括号中的其他位置,表示是一个字符^。
当^在[]中的第一个位置时,如果要匹配它本身,要用\转义。
当该符号用在方括号外面时,一般表示正则表达式的开始。
c.当-不在a和z,A和Z,0和9之间,单独出现时,表示是一个字符-。
d.在[]中的特殊符号,不用转义。
但是几个特殊字符除外:] 要转义,^在第一个位置要转义,反斜杠\,-要转义。
三个反斜杠\代表一个\(4个也代表一个反斜杠)。
参考2.phpvar_dump(preg_match_all('/[^a^\]]/', '33]3anba',$t)); //非a非]2.3 重复匹配重复* 表示这个模式可以被重复0次,1次或多次 a{0,}+ 表示这个模式可以被重复1次或多次 a{1,}? 表示这个模式可以被重复0次或1次 a{0,1}计数{5} 表示匹配5次{2,} 表示至少匹配2次{0,5} 表示至多匹配5次(不能写成{,5}){2,5} 表示最少匹配2次,最多匹配5次注:,后面不能有空格参考3.php2.4 开始或结尾^ (或\A)用于正则表达式的开始$ (或\Z)用于正则表达式的结尾例:^andy 表示在字符串开始处是 andy.cn$ 表示在字符串结尾处是 .cn^[a-z]$表示只包含a到z之间一个字符的字符串。
参考 4.php\B相当于\w ?元字符“\b”对单词(指\w)的边界进行匹配;“\B”对单词的内部进行匹配。
例如:在字符串“This island is a beautiful land”中使用/\bis\b/可以匹配单词“is”,而与“This”或者“island”无关。
/\bis/与单词左边界匹配,可以匹配单词“is”和“island”中的“is”;/\Bis/不与单词左边界匹配,可以匹配单词“This”中的“is”。
/\Bis\B/ 将明确的指示不与单词的左、右边界匹配,只匹配单词的内部。
所以在这个例子中没有匹配结果。
参考 5.php2.5 元字符“.”元字符“.”匹配除换行符外任何一个字符,相当于[^\n](Unix系统)或[^\r\n](Windows系统)。
不是html的换行<br />。
例如:/pr.y/可以匹配目字符串“prey”、“pray”或“pr%y”等。
通常,可以使用“.*”组合来匹配除换行符外的任何字符串。
在一些书籍中也称其为“全匹配符”或“单含匹配符”。
例如:/a.*z/ 表示可以匹配以字母“a”开头,字母“z”结束的任意不包括换行符的字符串。
“. +”也可以完成类似的匹配功能,所不同的是其至少匹配一个字符。
例如:/a.+z/将不匹配字符串“az”。
参考 6.php2.6 选择符元字符“|”又称模式选择符(或)。
在正则表达式中匹配两个或更多的选择之一。
例如:在字符串“There are many apples and pears.”中,/apple|pear/在第一次运行时匹配“apple”;再次运行时匹配“pear”。
也可以继续增加选项,如/apple|pear|banana|lemon/。
com|cn|net表示匹配com、cn或net参考7.php2.7 子表达式(又称原子、模式单元或组)元字符“()”将其中的正则表达式变为原子(或称模式单元)使用。
与数学表达式中的括号类似,“()”可以作为一个单元被单独使用。
例如:/(Dog)+/匹配的“Dog”、“DogDog”、“DogDogDog”……,因为紧接着“+”前的原子是用元字符“()”括起来的字符串“Dog”。
参考7-2.php 7-3.php2.8 匹配特殊字符特殊字符有一般加\,如要匹配$ ,则使用 \$一些特殊字符:\ ^ $ . | ( ) * + ? { } -% , \ * " ' | \s \t < > & ~注意:在PHP中,一般将正则表达式模式包括在一个单引号字符串中。
使用双引号可能会出现一些问题。
当这些特殊字符放在[]中时,不需要转义(除反斜杠\、右方框号]、^在第一个位置、-)。
参考8.phpif(preg_match('/[\^\($#\]]/', $username)){echo '有非法字符';}2.9 模式匹配的顺序在使用正则表达式时,需要注意匹配的顺序。
通常,正则表达式按照由左至右的顺序依次匹配。
列出了其他字符的匹配顺序:顺序元字符说明1 () 模式单元2 ? * + {} 重复匹配3 ^ $ \b \B \A \Z 边界限制4 | 模式选择2.10 模式修正符(Pattern Modifiers)模式修正符扩展了正则表达式在字符匹配、替换操作时的某些功能。
这些扩展或者说修正增强了正则表达式的处理能力。
模式修正符一般标记于整个模式之外,并且可以组合使用,如“/apple/i”、“/cat|dog/Uis”等。
下面列出了一些常用的模式修正符及其功能说明:模式修正符说明i 可同时匹配大小写字母m 将字符串视为多行s 将字符串视为单行,换行符作为普通字符看待x 模式中的空白忽略不计S 当一个模式将被使用若干次时,为加速匹配起见值得先对其进行分析U 匹配到最近的字符串e 将替换的字符串作为表达式使用参考9.php3、PHP中的正则表达式相关函数在PHP中有两套正则表达式函数库。
一套是由PCRE(Perl Compatible Regular Expression)库提供的。
PCRE库使用和Perl相同的语法规则实现了正则表达式的模式匹配,其使用以“preg_”为前缀命名的函数。
另一套是由POSIX(Portable Operation System interface)扩展库提供的。
POSIX扩展的正则表达式由POSIX 1003.2定义,一般使用以“ereg_”为前缀命名的函数。
两套函数库的功能相似,执行效率稍有不同。
一般而言,实现相同的功能,使用PCRE库的效率略占优势。
PCRE相关函数preg_*preg_match()用于查找int preg_match (string $pattern, string $content [, array $matches])preg_match ()函数在$content字符串中搜索与$pattern给出的正则表达式相匹配的内容。