PHP正则表达式教程1、入门简介在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。很可能你使用过Windows/Dos下用于文件查找的通配符(wildcard),也就是*和?。如果你想查找某个目录下的所有的Word文档的话,你会搜索*.doc。在这里,*会被解释成任意的字符串。和通配符类似,正则表达式也是用来进行文本匹配的工具,只不过比起通配符,它能更精确地描述你的需求——当然,代价就是更复杂——比如你可以编写一个正则表达式,用来查找所有以0开头,后面跟着2-3个数字,然后是一个连字号“-”,最后是7或8位数字的字符串(像010-12345678或0376-7654321)。2、基本语法正则表达式(regularexpression)描述了一种字符串匹配的模式,可以用来检查一个字符串串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。格式如下:/正则表达式/[模式修正符]正则表达式包含:1、普通字符:包含a-z、A-Z、0-92、元字符:包含特殊符号、转义字符、限定符、定位符3、模式修正符:用固定的字符,表示特定含义,是正则补充说明的1)普通字符普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。2)转义字符\将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,'n'匹配字符n。'\n'匹配一个换行符。序列'\\'匹配\而\(则匹配(。常用转义字符:\d匹配一个数字字符。等价于[0-9]\D匹配一个非数字字符。等价于[^0-9]\w匹配包括下划线的任何单词字符。等价于[A-Za-z0-9_]\W匹配任何非单词字符。等价于[^A-Za-z0-9_]\b匹配一个单词边界,也就是指单词和空格间的位置。例如,'er\b'可以匹配never中的'er',但不能匹配verb中的'er'\B匹配非单词边界。'er\B'能匹配verb中的'er',但不能匹配never中的'er'\cx匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的'c'字符\f匹配一个换页符。等价于\x0c和\cL\n匹配一个换行符。等价于\x0a和\cJ\r匹配一个回车符。等价于\x0d和\cM\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于[\f\n\r\t\v]\S匹配任何非空白字符。等价于[^\f\n\r\t\v]\t匹配一个制表符。等价于\x09和\cI\v匹配一个垂直制表符。等价于\x0b和\cK3)特殊字符所谓特殊字符,就是一些有特殊含义的字符()标记一个子表达式的开始和结束位置,子表达式可以获取供以后使用.匹配除换行符\n之外的任何单字符[标记一个中括号表达式的开始'n'匹配字符'n'。'\n'匹配换行符。序列'\\'匹配\,而'\('则匹配(|指明两项之间的一个选择[^]否定符注意:a)“()”把字符串组合在一起。“()”符号包含的内容必须同时出现在目标对象中。例如“(abc)”等的字符串匹配,则匹配“abc34”或“12abctt”b)\\1提取第一位的属性例如:/^\d{2}([\W])\d{2}\\1\d{4}$/匹配“12-31-2006”、“09/27/1996”、“86014321”等字符串。但上述正则表达式不匹配“12/34-5678”的格式,这是因为模式“[\W]”的结果“/”已经被存储,下个位置“\1”引用时,其匹配模式也是字符“/”。c)如果我们希望在正则表达式中实现类似编程逻辑中的“或”运算,在多个不同的模式中任选一个进行匹配的话,可以使用管道符“|”。例如:/to|too|2/上述正则表达式将会与目标对象中的“to”,“too”,或“2”相匹配。d)与定位符“^”不同,否定符“[^]”规定目标对象中不能存在模式中所规定的字符串。例如:/[^A-C]/目标对象中除A,B,和C之外的任何字符相匹配。4)限定符限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配*匹配前面的子表达式零次或多次。例如,zo*能匹配z以及zoo。*等价于{0,}+匹配前面的子表达式一次或多次。例如,'zo+'能匹配zo以及zoo,但不能匹配z。+等价于{1,}。?匹配前面的子表达式零次或一次。例如,do(es)?可以匹配do或does中的do。?等价于{0,1}。{n}n是一个非负整数。匹配确定的n次。例如,'o{2}'不能匹配Bob中的'o',但是能匹配food中的两个o{n,}n是一个非负整数。至少匹配n次。例如,'o{2,}'不能匹配Bob中的'o',但能匹配foooood中的所有o。'o{1,}'等价于'o+'。'o{0,}'则等价于'o*'{n,m}m和n均为非负整数,其中n=m。最少匹配n次且最多匹配m次。例如,o{1,3}将匹配fooooood中的前三个o。'o{0,1}'等价于'o?'。请注意在逗号和两个数之间不能有空格。5)定位符定位符使您能够将正则表达式固定到行首或行尾。它们还使您能够创建这样的正则表达式,这些正则表达式出现在一个单词内、在一个单词的开头或者一个单词的结尾。^匹配输入字符串开始的位置。如果设置了RegExp对象的Multiline属性,^还会与\n或\r之后的位置匹配$匹配输入字符串结尾的位置。如果设置了RegExp对象的Multiline属性,$还会与\n或\r之前的位置匹配\b匹配一个字边界,即字与空格间的位置\B非字边界匹配。6)模式修正符(PatternModifiers)模式修正符在忽略大小写、匹配多行中使用特别多,掌握了这一个修正符,往往能解决我们遇到的很多问题。i匹配时忽略大小写,可同时匹配大小写字母m将字符串视为多行,当设定了此修正符,行起始(^)和行结束($)除了匹配整个字符串开头和结束外,还分别匹配其中的换行符(\n)的之后和之前s将字符串视为单行,换行符做普通字符看待,使“.”匹配任何字符x模式中的空白忽略不计U匹配到最近的字符串,禁止贪婪匹配,只跟踪到最近的一个匹配符并结束,常用在采集程序上的正则表达式;U模式字符串被当成UTF-8e将替换的字符串作为表达使用,只有preg_replace()使用此修正符,其它PCRE函数将忽略之A如果设定了此修正符,模式被强制为“anchored”,即强制仅从目标字符串的开头开始匹配D如果设定了此修正符,模式中的行结束($)仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,也会被匹配在里面,如果设定了m修正符则忽略此选项7)运算符优先级正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。下表从高到低优先级顺序:\转义符(),(?:),(?=),[]圆括号和方括号*,+,?,{n},{n,},{n,m}限定符^,$,\任何元字符、任何字符定位点和序列(即:位置和顺序)|替换,或操作字符具有高于替换运算符的优先级,使得m|food匹配m或food。若要匹配mood或food,请使用括号创建子表达式,从而产生(m|f)ood。3、正则函数函数的具体使用,我们可以通过PHP手册来找到。preg_grep()preg_match_all()preg_match()preg_quote()preg_split()preg_replace()4、具体实例1)/[A-Z]/上述正则表达式将会与从A到Z范围内任何一个大写字母相匹配。2)/[a-z]/上述正则表达式将会与从a到z范围内任何一个小写字母相匹配。3)/[0-9]/上述正则表达式将会与从0到9范围内任何一个数字相匹配。4)/([a-z][A-Z][0-9])+/上述正则表达式将会与任何由字母和数字组成的字符串,如“aB0”等相匹配。5)当用户需要在正则表达式的模式中加入元字符,并查找其匹配对象时,可以使用转义字符“\”。例如:/Th\*/上述正则表达式将会与目标对象中的“Th*”而非“The”等相匹配。6)当不需要存储匹配结果时使用非存储模式单元“(?:)”例如/(?:a|b|c)(D|E|F)\\1g/将匹配“aEEg”。在一些正则表达式中,使用非存储模式单元是必要的,否则需要改变其后引用的顺序。上例还可以写成/(a|b|c)(C|E|F)\2g/。7)还是得说说^和$他们是分别用来匹配字符串的开始和结束,以下分别举例说明“^The”:开头一定要有”The”字符串;“ofdespair$”:结尾一定要有”ofdespair”的字符串;那么,“^abc$”:就是要求以abc开头和以abc结尾的字符串,实际上是只有abc匹配;“notice”:匹配包含notice的字符串;你可以看见如果你没有用我们提到的两个字符(最后一个例子),就是说模式(正则表达式)可以出现在被检验字符串的任何地方,你没有把他锁定到两边。8)说说‘*’‘+’和‘?’“ab*”:和ab{0,}同义,匹配以a开头,后面可以接0个或者N个b组成的字符串(”a”,“ab”,“abbb”,等);“ab+”:和ab{1,}同义,同上条一样,但最少要有一个b存在(”ab”“abbb”等);“ab?”:和ab{0,1}同义,可以没有或者只有一个b;“a?b+$”:匹配以一个或者0个a再加上一个以上的b结尾的字符串。要点:’*’‘+’和‘?’只管它前面那个字符。9)你也可以在大括号里面限制字符出现的个数,比如:“ab{2}”:要求a后面一定要跟两个b(一个也不能少)(”abb”);“ab{2,}”:要求a后面一定要有两个或者两个以上b(如”abb”“abbbb”等);“ab{3,5}”:要求a后面可以有2-5个b(”abbb”,“abbbb”,or“abbbbb”)。10)现在我们把一定几个字符放到小括号里,比如:“a(bc)*”:匹配a后面跟0个或者一个”bc”;“a(bc){1,5}”:一个到5个“bc”;11)还有一个字符‘|’,相当于OR操作:“hi|hello”:匹配含有”hi”或者“hello”的字符串;“(b|cd)ef”:匹配含有“bef”或者“cdef”的字符串;“(a|b)*c”:匹配含有这样多个(包括0个)a或b,后面跟一个c的字符串;12)一个点(’.’)可以代表所有的单一字符,不包括”\n”如果,要匹配包括”\n”在内的所有单个字符,怎么办?用’[\n.]’这种模式。“a.[0-9]”:一个a加一个字符再加一个0到9的数字;“^.{3}$”:三个任意字符结尾。13)中括号括住的内容只匹配一个单一的字符“[ab]”:匹配单个的a或者b(和“a│b”一样);“[a-d]”:匹配’a’到’d’的单个字符(和”a│b│c│d”还有“[abcd]”效果一样);一般我们都用[a-zA-Z]来指定字符为一个大小写英文:“^[a-zA-Z]”:匹配以大小写字母开头的字符串;14)“[0-9]%”:匹配含有形如x%的字符串;“,[a-zA-Z0-9]$”:匹配以逗号再加一个数字或字母结尾的字符串;15)你也可以把你不想要得字符列在中括号里,你只需要在总括号里面使用’^’作为开头“%[^a-zA-Z]%”:匹配含有两个百分号里面有一个非字母的字符串。要点:^用在中括号开头的时候,就表示排除括号里的字符。5、常用正则表达式1、非负整数:^\d+$2、正整数:^[0-9]*[1-9][0-9]*$3、非正整数:^((-\d+)|(0+))$4、负整数:^-[0-9]*[1-9][0-9]*$5、整数:^-?\d+$6、非负浮点数:^\d+(\.\d+)?$7、正浮点数:^((0-9)+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$8、非正浮点数:^((-\d+\.\d+)?