1、PHP正则表达式,网址:http:/ 电话:400 700 1307,正则表达式,基本概念正则表达式语法规则PCRE (Perl) 兼容正则表达式函数POSIX 扩展正则表达式函数,正则表达式简介正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。到目前为止,我们前面所用过的精确(文本)匹配也是一种正则表达式。在PHP中,正则表达式一般是由正规字符和一些特殊字符(类似于通配符)联合构成的一个文本模式的程序性描述。,正则表达式简介,在PHP中有两套正则表达式函数库,两者功能相似,只是执行效率略有差异:一套是由PCRE(Perl Compatib
2、le Regular Expression)库提供的。使用“preg_”为前缀命名的函数;一套由POSIX(Portable Operating System Interface of Unix )扩展提供的。使用以“ereg_”为前缀命名的函数;使用正则表达式的原因之一,是在典型的搜索和替换操作中,只能对确切文字进行匹配,对象动态文本的搜索就有困难了,甚至是不可能的。举例:想一想这两个正则表达式做什么用?/-?d+$|-?0xXda-fA-F+$/0-9a-zA-Z_-+0-9a-zA-Z_-+(.0-9a-zA-Z_-+)0,3$/,正则表达式较重要和较有用的角色是验证用户数据的有效性检查
3、。PHP中,正则表达式有三个作用: 匹配,也常常用于从字符串中析取信息。 用新文本代替匹配文本。 将一个字符串拆分为一组更小的信息块。,PCRE正则表达式,PCRE全称为Perl Compatible Regular Expression,意思是Perl兼容正则表达式。PCRE来源于Perl语言,而Perl是对字符串操作功能最强大的语言之一,PHP的最初版本就是由Perl开发的产品。PCRE语法支持更多特性,比POSIX语法更强大,实现相同的功能函数,使用PCRE库的效率略占优势。但是它们也有很多相同点。在PCRE中,通常将模式表达式(即正则表达式)包含在两个反斜线“/”之间,如“/apple
4、/”。用户只要把需要匹配的模式内容放入定界之间即可。作为定界的字符也不仅仅局限于“/”。除了字母、数字和斜线“”以外的任何字符都可以作为定界符,像“#”、“/”、“!”等都可以的。,正则表达式的语法规则,正则表达式主要组成:原子(普通字符,如英文字符)元字符(有特殊功用的字符)模式修正字符(对正则表达式语义的修正)一个正则表达式中至少包含一个原子。,原子(Atom),原子是组成正则表达式的基本单位,在分析正则表达式时,应作为一个整体。原子字符包括所有的英文字母、数字、标点符号以及其他一些符号。原子也包括以下内容。单个字符、数字,如az,AZ,09。模式单元,如(ABC)可以理解为由多个原子组成
5、的大的原子。原子表,如 ABC。重新使用的模式单元,如:1普通转义字符,如:d, D, w转义元字符,如:*,.,普通转义字符,原子说明-d匹配一个数字;等价于0-9D匹配除数字以外任何一个字符;等价于0-9w匹配一个英文字母、数字或下划线;等价于0-9a-zA-Z_W匹配除英文字母、数字和下划线以外任何一个字符;等价于0-9a-zA-Z_s匹配一个空白字符;等价于fnrtvS匹配除空白字符以外任何一个字符;等价于fnrtvf匹配一个换页符等价于 x0c 或 cLn匹配一个换行符;等价于 x0a 或 cJr匹配一个回车符等价于x0d 或 cMt匹配一个制表符;等价于 x09或clv匹配一个垂直
6、制表符;等价于x0b或ckoNN匹配一个八进制数字xNN匹配一个十六进制数字cC匹配一个控制字符,元字符(Meta-character),元字符是用于构造规则表达式的具有特殊含义的字符。如果要在正则表达式中包含元字符本身,必须在其前加上”进行转义 元字符说明*0次、1次或多次匹配其前的原子+1次或多次匹配其前的原子?0次或1次匹配其前的原子|匹配两个或多个选择 或 A匹配字符串串首的原子$ 或 Z 匹配字符串串尾的原子b匹配单词的边界B匹配除单词边界以外的部分匹配方括号中的任一原子匹配除方括号中的原子外的任何字符m表示其前原子恰好出现m次m,n表示其前原子至少出现m次,至少出现n次(nm)m,
7、表示其前原子出现不少于m次()整体表示一个原子.匹配除换行之外的任何一个字符,字符串边界限制,在某些情况下,需要对匹配范围进行限定,以获得更准确的匹配结果。“”和“$”分别指定字符串的开始和结束。例如,在字符串“Tom and Jerry chased each other in the house until toms uncel come in”中元字符“”或“A” 置于字符串的开始确保模式匹配出现在字符串首端;/Tom/元字符“$”或“Z” 置于字符串的结束,确保模式匹配出现字符串尾端。/in$/如果不加边界限制元字符,将获得更多的匹配结果。/Tom$/精确匹配/Tom/模糊匹配,单词边
8、界限制,在使用各种编辑软件的查找功能时,可以通过选择“按单词查找”获得更准确的结果。正则表达式中也提供类似的功能。例如:在字符串“This island is a beautiful land”中元字符“b”对单词的边界进行匹配;/bisb/匹配单词“is”,不匹配“This”和“island”。/bis/匹配单词“is”和“island”中的“is”,不匹配“This”元字符“B”对除单词边界以外的部分进行匹配。/BisB/将明确的指示不与单词的左、右边界匹配,只匹配单词 的内部。所以在这个例子中没有结果。/Bis/匹配单词“This”中的“is”,重复匹配,正则表达式中有一些用于重复匹配某
9、些原子的元字符:“?”、“*”、“+”。他们主要的区别是重复匹配的次数不同。元字符“?”:表示0次或1次匹配紧接在其前的原子。例如:/colou?r/匹配“colour”或“color”。元字符“*”:表示0次、1次或多次匹配紧接在其前的原子。例如:/zo*/可以匹配z、zoo元字符“+”:表示1次或多次匹配紧接在其前的原子。例如:/go+gle/匹配“gogle”、“google”或“gooogle”等中间含有多个o的字符串。,任何一个字符,元字符“.”匹配除换行符外任何一个字符,相当于n(Unix系统)或rn(windows系统)。例如:/pr.y/可以匹配的字符串“prey”、“pray
10、”或“pr%y”等。通常可以使用“.*”组合来匹配除换行符外的任何字符。在一些书籍中也称其为“全匹配符” 或 “单含匹配符”。例如:/a.*z$/表示可以匹配字母“a”开头,字母“z”结束的任意不包括换行符的字符串。/.+/也可以完成类似的匹配功能所不同的是其至少匹配一个字符。/a.+z$/匹配“az”不匹配字符串“az”。,重复匹配,元字符“”准确地指定原子重复的次数,指定所匹配的原子出现的次数。“m”表示其前原子恰好出现m次;“m,n”表示其前原子至少出现m次,至多出现n次;“m,”表示其前原子出现不少于m次。例如:/zo1,3m/只能匹配字符串“zom”、“zoom”、或“zooom”。
11、/zo3m/只能匹配字符串“zooom”/zo3,m/可以匹配以 “z” 开头,“m”结束,中间至少为3个“o”的字符串。 /bo0,1u/可以匹配字符串“bought a butter” 中的“bou”和“bu”,等价于bo?u。,原子表 方括号表达式,原子表”中存放一组原子,彼此地位平等,且仅匹配其中的一个原子。如果想匹配一个 ”a” 或 ”e” 使用 ae。例如: Praey 匹配 ”Pray” 或者 ”Prey ”。原子表 ” 或者称为排除原子表,匹配除表内原子外的任意一个字符。例如:/pu/匹配“part”中的“pa”,但无法匹配“computer”中的“pu”因为“u”在匹配中被排
12、除。原子表“-”用于连接一组按ASCII码顺序排列的原子,简化书写。 例如:/x0123456789/可以写成x0-9,用来匹配一个由 “x” 字母与一个数字组成的字符串。例如:/a-zA-Z/匹配所有大小写字母/a-z0-9$/匹配比如“z2”、 “t6” 、“g7”/0xX0-9a-fA-F/匹配一个简单的十六进制数字,如“0x9”。/0-9a-zA-Z_/匹配除英文字母、数字和下划线以外任何一个字符,其等价于W。 /0? xX0-9a-fA-F+/匹配十六进制数字,可以匹配“0x9B3C”或者“X800”等。/可以匹配“”、“”或“”等HTML标签,并且不严格的控制大小写。,模式选择符,
13、元字符“|”又称模式选择符。在正则表达式中匹配两个或更多的选择之一。例如:在字符串“There are many apples and pears.”中,/apple|pear/在第一次运行时匹配“apple”;再次运行时匹配“ pear”。也可以继续增加选项,如:/apple|pear|banana|lemon/,模式单元,元字符“()”将其中的正则表达式变为原子(或称模式单元)使用。与数学表达式中的括号类似,“()”可以做一个单元被单独使用。例如:/(Dog)+/匹配的“Dog”、“DogDog”、“DogDogDog”,因为紧接着“+”前的原子是元字符“()”括起来的字符串“Dog”。/
14、You (very )+ old/匹配“You very old”、“You very very old”/Hello (world|earth)/匹配“Hello world”、“Hello earth”一个模式单元中的表达式将被优先匹配或运算。,重新使用的模式单元,系统自动将模式单元“()”中的匹配依次存储起来,在需要时可以用“1”、“2”、“3”的形式进行引用。当正则表达式包含有相同的模式单元时,这种方法非常便于对其进行管理。注意使用时需要写成“1”、“2”例如:/d2(W)d21d4$/匹配“12-31-2006”、“09/27/1996”、“86 01 4321”等字符串。但上述正则
15、表达式不匹配“12/34-5678”的格式。这是因为模式“W”的结果“/”已经被存储。下个位置“1”引用时,其匹配模式也是字符“/”。当不需要存储匹配结果时使用非存储模式单元“(?:)” 例如/(?:a|b|c)(D|E|F)1g/ 将匹配“aEEg”。在一些正则表达式中,使用非存储模式单元是必要的。否则,需要改变其后引用的顺序。上例还可以写成/(a|b|c)(C|E|F)2g/。,模式修正符(Pattern Modifiers),在PCRE表达式中的最后一个分隔符/后,可以添加模式修正符,扩展了正则表达式在字符匹配、替换操作时的某些功能,修正增强了正则表达式的处理能力。模式修正符一般标记于整
16、个模式之外,并且可以组合使用,如“/apple/i”、“/cat|dog/uis”等。模式修正符说明i可同时匹配大小写字母m将字符串视为多行s将字符串视为单行,换行符做普通字符看 待,使“.”匹配任何字符x模式中的空白忽略不计S - 当一个模式将被使用若干次时,先对其进行 分析U匹配到最近的字符串e将替换的字符串作为表达使用,下面是几个简单的示例,可以说明模式修正符的使用/apple/i匹配“apple”或“Apple”等,忽略大小写。/I love you/ix匹配“iloveYou”,忽略大小写以及空白。/ U将依次匹配字符串“Cool music Few years ago. ”中的“”
17、、“”和“”。而/却匹配到最后一个可用的字符串,既“Coolmusic” 。/Uis将HTML文件视为单行字符串,忽略大小写和换行符。匹配其中的所有以“h”开头的标签,如“”、“”等。,模式匹配的顺序,在使用正则表达式时,需要注意匹配的顺序。通常,正则表达式按照由左至右的顺序依次匹配。模式匹配的顺序(从高到低)顺序元字符说明 1() 模式单元 2?* + 重复匹配 3 $ 边界限制 4 | 模式选择,PCRE正则表达式函数,preg_match()和preg_match_all()preg_grep()preg_quote()preg_split()preg_replace(),正则表达式的匹
18、配,preg_match() 函数函数原形:int preg_match(string $pattern, string $content ,array $matches)preg_match()函数在$content字符串中搜索与$pattern给出的正则表达式相匹配的内容。如果提供了$matches,则将匹配结果放入其中。$matches0将包含与整个匹配的文本,$matches1将包含第一个捕获的与括号中的模式单元所匹配的内容,以此类推。该函数只作一次匹配,最终返回0或1的判断是否匹配。,进行全局正则表达式匹配,preg_match_all()与preg_match()函数类似。如果使用
19、了第三个参数,将把所有可能的匹配结果放入。本函数返回整个模式匹配的次数(可能为0),如果出错返回False。, $max_size) $link_text = substr($link_url, 0, $max_size).; else $link_text = $link_url; /生成HTML文字$text = str_replace($link_url,$link_text,$text); return $text;,/运行实例$str = “这是一个包含多个URL链接地址的多行文字。欢迎访问http:/”;print url2html($str);/*输出结果这是一个包含多个URL链
20、接地址的多行文字。欢迎访问http:/*/?,preg_grep(),函数原型: array preg_grep(string $pattern,array $input)preg_grep()函数返回一个数组,其中包括了$input数组中与$pattern正则表达式相匹配的单元(注:$input不能为null)。对于输入数组$input中的每个元素,preg_grep()也只进行一次匹配。,preg_quote,函数原型string perg_quote(string str,string delimiter)preg_quote转义正则表达式字符 正则表达式的特殊字符包括:. + * ?
21、$ ( ) = ! | :,正则表达式的拆分,preg_split()函数原型:array preg_split (string $pattern,string $string,int $limit,int flags)本函数返回一个字符串数组,每个单元为$string经正则表达式$pattern作为边界分割出的子串。如果设定了$limit,则返回的数组最多包含$limit个单元。而其中最后一个单元包含了$string中剩余的所有部分。flags可选参数:PREG_SPLIT_NO_EMPTY:只返回非空的成分 PREG_SPLIT_DELIM_CAPTURE :定界符模式中的括号表达式也会被
22、捕获并返回 PREG_SPLIT_OFFSET_CAPTURE :对每个出现的匹配结果也同时返回其附属的字符串偏移量,preg_split(),将字符串分割成字符 将字符串分割为匹配项及其偏移量 ,正则表达式的替换,preg_replace()函数原形:mixed preg_replace(mixed $patten,mixed $replacement,mixed $subject,int $limit)preg_replace其前三个参数均可以使用数组;第四个参数$limit可以设置替换的次数,默认为全部替换。,nEmail: EmailnAddress: Addressn;/模式$pat
23、terns =array(/Address/,/Name/,/Email/);/替换字串$replacements = array (No.5, Wilson St., New York, U.S.A,Thomas Ching,,);/输出模式替换结果print preg_replace($patterns, $replacements, $string);?,POSIX正则表达式,POSIX正则表达式全称为Portable Operating System Interface of Unix,意为UNIX可移植操作系实现接口。构造POSIX正则表达式的方法和创建数学表达式的方法一样,也就是用
24、多种元字符与操作符将小的表达式结合在一起来创建更大的表达式。,POSIX风格预定义的正则表达式的字符类: :alnum: 字母和数字字符 :alpha:大小写字母 :lower:小写字母 :upper:大写字母 :digit:数字0-9 :xdigit:十六进制数字 :punct:标点符号,包括上档键! :blank:TAB制表符和空格 :space:任何空白字符,换行,回车符 :cntrl:控制字符(TAB,退格),a-zA-Z0-9,0-9,t,a-zA-Z,a-z,A-Z,0-9a-fA-F,特殊的:graph:是:alpha: :digit: :punct:的合体,POSIX正则表达式
25、函数,ereg()和eregi()ereg_replace()和eregi_replace()split()和spliti(),ereg()和eregi(),ereg()字符串匹配函数,eregi()是ereg()函数的忽略大小的版本,函数返回的是一个布尔值,表明匹配成功与否。需要说明的是,POSIX扩展库函数的第一个参数接受的是正则表达式字符串,既不需要使用分隔符. 如果只是查找一个字符串中是否包含某个子字符串,建议使用strstr()或strpos()函数.,ereg_replace()和eregi_replace(),ereg_replace()和eregi_replace()函数原形:
26、string ereg_replace (string $pattern,string $replacement,string $string)string eregi_replace (“正则表达式”,“目标替换字符”,“替换目标”)ereg_replace()在$string中搜索模式字符串$pattern,并将所匹配结果替换为$replacement。当$pattern中包含模式单元”()”时,$replacement中形如“1”的位置将依次被这些子模式所匹配的内容替换。而“0”是整个的匹配字符串的内容。需要注意的是,在双引号中反斜线作为转义符使用,所以必须使用“0”,“1”的形式。er
27、egi_replace()和ereg_replace()的功能一致,只是前者忽略大小写,正则表达式的拆分,split()和spliti()函数原型:array split (string $pattern,string $string,int $limit)本函数返回一个字符串数组,每个单元为$string经正则表达式$pattern作为边界分割出的子串。如果设定了$limit,则返回的数组最多包含$limit个单元。而其中最后一个单元包含了$string中剩余的所有部分。spliti是split的忽略大小版本。,n;?,多行匹配,仅仅使用POSIX下的正则表达式函数,很难进行复杂的匹配操作。
28、例如,对整个文件(尤其是多行文本)进行匹配查找。使用ereg()函数的第三个参数,对此进行操作的一个方法是分行处理。 如果找到与 正则表达式 中圆括号()内的相匹配的子串并且函数调用给出了第三个参数 regs,匹配项将被存入 第三个参数regs 数组中。$regs1 包含第一个左圆括号开始的子串,$regs2 包含第二个子串,以此类推。$regs0 包含整个匹配的字符串。,正则表达式的Wed验证应用,电子邮件地址的校验URL地址的校验 电话号码和邮政编码的校验,电子邮件地址的校验,URL地址的校验,电话号码,邮政编码的校验,练习,验证正货币金额。要求小数点后有两位数字验证时间2009-01-05 13:04:06IP地址校验获取某网站所有超级链接获取某天气预报网站的气象信息,晕吧!休息一下吧_,