一、介绍1、什么是正则表达式正则表达式(RegularExpression)是用一定的模式匹配一??类字符串的公式。正则表达式使用单个字符串来描述和匹配符合某种语法规则的一系列字符串。正则表达式很麻烦,但它们很强大。学习后的应用,不仅会提高你的效率,还会给你带来绝对的成就感。只要认真阅读本教程,加上应用时的一些参考,掌握正则表达式不是问题。许多编程语言都支持使用正则表达式进行字符串操作。2、正则表达式的作用字符串的拆分、查找、匹配、替换3、PHP中的正则表达式PHP中有两套正则表达式函数库。两者的功能相似,只是执行效率略有不同:一套由PCRE(PerlCompatibleRegularExpression)库提供。以“preg_”前缀命名的函数;由POSIX(Unix的便携式操作系统接口)扩展提供的一组。使用以“ereg_”为前缀的函数;PCRE来源于Perl语言,Perl是最强大的字符串操作语言之一。PHP的原始版本是由Perl开发的。PCRE语法比POSIX语法支持更多的特性并且更强大。因此,本文主要介绍PCRE语法的正则表达式4.正则表达式的组成在PHP中,一个正则表达式分为三部分:定界符、表达式和模式修饰符。分隔符分隔符可以使用除字母、数字、反斜杠(\)和空白字符之外的任何ascii字符。最常用的分隔符是正斜杠(/)、哈希符号(#)和否定符号(~)。表达式由一些特殊字符和非特殊字符串组成。它是决定正则表达式匹配规则的主要部分。模式修饰符用于打开和关闭某些功能/模式。二、定界符1、定界符的选择使用PCRE函数时,正则表达式必须用定界符括起来。定界符可以使用除字母、数字、反斜杠(\)和空白字符之外的任何ascii字符。最常用的分隔符是正斜杠(/)、哈希符号(#)和否定符号(~)。/foobar/(合法)#^[^0-9]$#(合法)+php+(合法)%[a-zA-Z0-9_-]%(合法)#[a-zA-Z0-9_-]/(非法,两边分隔符不同)a[a-zA-Z0-9_-]a(非法,分隔符不能是字母)\[a-zA-Z0-9_-]\(非法,theseparatorcannotisabackslash(`\`))除了上面提到的分隔符,你还可以使用括号式的分隔符,左括号和右括号分别作为开始和结束分隔符。{thisisapattern}2.定界符的使用如果在正则表达式中使用定界符,则必须用反斜杠(\)进行转义。如果定界符在正则表达式中频繁出现,为了可读性,最好使用另一个定界符。/http:\/\//#http://#当需要在正则表达式中使用字符串时,可以使用preg_quote()函数进行转义。它的第二个参数(可选)可用于指定要转义的分隔符。//在本例中,preg_quote($word)用于保留星号和正斜杠(/)的原始含义,使其不在正则表达式中使用特殊语义。$textBody="这本书*/非常/*很难找到。";$word="*/very/*";$reg="/".preg_quote($word,'/')。“/”;回声$注册;//输出'/\*\/very\/\*/'echopreg_replace($reg,"".$word."",$textBody);//输出'这本书*/very/*很难找到。'您可以在结束定界符后添加模式修饰符来影响匹配效果。下面的例子是不区分大小写的匹配#[a-z]#i3.元字符1.转义字符描述\marksthenextcharacterasaspecialcharacter,oraliteralcharacter,orabackreference。例如,'n'匹配字符“n”。'n'匹配换行符。序列“\”匹配“”,“(”匹配“(”。2、定位符字符说明^匹配输入字符串的开头(或多行模式下的行首)$匹配输入字符串的结尾(或多行模式下的行尾)\b匹配awordboundary,即单词和空格之间的位置\B不是单词边界匹配3.限定符字符描述*与前面的子表达式匹配零次或多次。例如,zo将匹配“z”和“zoo”。相当于{0,}。+与前面的子表达式匹配一次或多次。例如,“zo+”会匹配“zo”和“zoo”,但不会匹配“z”。+等同于{1,}。?当这个字符用作量词时,表示匹配前面的子表达式零次或一次。例如,“做(是)吗?”将匹配“do”或“does”。?相当于{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?”。请注意,逗号和两个数字之间不能有空格。4.通用字符字符描述\d匹配一个数字字符。相当于[0-9]。\D匹配非数字字符。相当于[^0-9]。\w匹配字母、数字和下划线。相当于[A-Za-z0-9_]。\W匹配非字母、数字、下划线。相当于[^A-Za-z0-9_]。\s匹配任何空白字符,包括空格、制表符、换页等等。等同于[\f\n\r\t\v]。\S匹配任何非空白字符。等同于[^\f\n\r\t\v]。.匹配除换行符(n,r)之外的任何单个字符。要匹配包括“n”在内的任何字符,请使用像“(.n)”这样的正则表达式。5.非打印字符字符描述\n匹配一个换行符。相当于x0a和cJ。\r匹配回车符。相当于x0d和cM。\t匹配制表符。相当于x09和cI。6.多选分支字符的字符描述|竖线字符|可以匹配许多选择之一。例如,'z|food'将匹配“z”或“food”。'(z|f|g)ood'匹配“zood”、“food”或“good”。7、字符组字符描述[x|y]匹配x或y。例如,'z|food'将匹配“z”或“food”。'(z|f)ood'匹配“zood”或“food”。[xyz]字符集。匹配任何一个包含的字符。例如,[abc]将匹配“plain”中的“a”。[^xyz]负字符集。匹配任何未包含的字符。例如,[^abc]匹配"plain"中的'p'、'l'、'i'、'n'。[a-z]字符范围。匹配指定范围内的任意字符。例如,[a-z]匹配“a”到“z”范围内的任何小写字母字符。[^a-z]负字符范围。匹配不在指定范围内的任意字符。例如,[^a-z]匹配不在“a”到“z”范围内的任何字符。8、非贪心匹配器的字符描述?当此字符跟在任何其他限制符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式为non-greedy。非贪婪模式尽可能少地匹配搜索字符串,而默认的贪婪模式尽可能多地匹配搜索字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o”。9.()组字符描述(pattern)匹配pattern,得到本次匹配。要匹配括号字符,请使用\(或\)。(?:pattern)匹配pattern但没有得到匹配结果,即非getting匹配,不存储以备后用。这对于使用“或”字符(|)组合正则表达式的各个部分很有用。例如,'industr(?:y|ies)是比'industry|industries'更短的表达式。(?=pattern)前瞻肯定断言,它与匹配模式的任何字符串开头的查找字符串相匹配。这是一个非获取匹配,即匹配不需要获取以备后用。例如,“Windows(?=95|98|NT|2000)”匹配“Windows2000”中的“Windows”,但不匹配“Windows3.1”中的“Windows”。Lookaheads不消耗字符,也就是说,在匹配发生后,搜索下一个匹配项会在最后一个匹配项之后立即开始,而不是在包含lookahead的字符之后。(?!pattern)与任何不匹配模式的字符串开头的搜索字符串相匹配的肯定否定断言。这是一个非获取匹配,即匹配不需要获取以备后用。例如,“Windows(?!95|98|NT|2000)”可以匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。Lookaheads不消耗字符,也就是说,在匹配发生后,搜索下一个匹配项会在最后一个匹配项之后立即开始,而不是在包含lookahead的字符之后。(?<=pattern)Reverse(向后看)positivepre-check与positive正向预检类似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”匹配“2000Windows”中的“Windows”,但不匹配“3.1Windows”中的“Windows”。(?abcdef';$pattern='|(.*)|';preg_match_all($pattern,$str,$matches);.*在使用U修饰符的情况下会匹配abcdef,然后加上?量词后负负为正,依然贪心匹配$str='abcdef';$pattern='|(.*?)|U';preg_match_all($pattern,$str,$matches);.*会匹配abcdef非贪婪模式方法一.使用?切换到非贪婪模式$str='abcdef';$pattern='|(.*?)|';preg_match_all($pattern,$str,$matches);.*将分别匹配abc和def。方法二、使用修饰符U转换为非贪婪模式$str='abcdef';$pattern='|(.*)|U';preg_match_all($pattern,$str,$matches);.*将匹配abc,def5。u(支持UTF-8转义表达式)这个修饰符使得正则表达式和目标字符串都被认为是UTF-8编码。无效的目标字符串会导致preg_*函数不匹配任何内容;无效的正则表达式字符串会导致E_WARNING级别错误。$str='中文';$pattern='/^[\x{4e00}-\x{9fa5}]+$/u';if(preg_match($pattern,$str)){echo'整个字符串是中文';}else{echo'字符串不全是中文';}6.D(结束限制)默认情况下,如果使用$来限制结束字符,当字符串以换行符结尾时,$符号也将匹配该换行符(但不匹配之前的任何换行符)。如果设置了这个修饰符,则正则表达式中的$符号只匹配目标字符串的结尾。如果设置了修饰符m,则忽略此修饰符。7.x如果设置了该修饰符,正则表达式中未转义或不属于字符类的空白数据字符将始终被忽略,未转义字符类之外的#字符和下一个换行符之间的字符也将被忽略。8.A如果设置了这个修饰符,则正则表达式被强制为“锚点”模式,即限制匹配只从目标字符串的开头开始搜索。9.当一个正则表达式需要多次使用时,值得花一些时间做一些额外的分析,以提高匹配速度。如果设置了此修饰符,则会执行此附加分析。目前,这种对正则表达式的分析仅适用于非锚模式(即没有单个固定起始字符)的匹配。5.反向引用以()标记开头和结尾的多个原子,既是一个独立的单元,又是一个子表达式。在()内的子表达式之外,后跟大于0的数字的反斜杠是对之前出现的子表达式的反向引用。反向引用用于重复搜索与前面()之一中的子表达式匹配的文本。1.在正则表达式中使用反向引用(sens|respons)e和\1ibility会匹配“senseandsensitivity”和“responseandresponsibility”,但不会匹配“senseandresponsibility”2.在PCRE函数中使用backreferencesabcdef';$pattern='/(.*)<\/b>(.*)<\/b>/';$replace=preg_replace($pattern,'\\1',$str);回声$替换。"\n";$replace=preg_replace($pattern,'\\2',$str);echo$replace。"\n";Output:abcdef六、正则表达式中常用的PCRE函数PHP官网上的解释已经很详细了,这里就不赘述了执行正则表达式匹配preg_match()执行一个正则表达式全局匹配preg_match_all()执行正则表达式搜索并替换preg_replace()执行正则表达式搜索并使用回调替换preg_replace_callback()执行多个正则表达式搜索并使用相应的回调替换preg_replace_callback_array()通过正则表达式分隔字符串preg_split()七。应用实践1、正则表达式匹配中文UTF-8汉字编码范围在ANSI(GB2312)环境下为0x4e00-0x9fa5、0xb0-0xf7、0xa1-0xfeUTF-8使用u模式修饰符使模式串被视为UTF-8.在ANSI(GB2312)环境下,使用chr将Ascii码转换成字符UTF-8';$pattern='/
