一、简介1. 什么是正则表达式
正则表达式(Regular Expression)就是用某种模式去匹配一类字符串的一种公式。 2. 正则表达式的作用分割,查找,匹配,替换字符串 3. PHP中的正则表达式在PHP中有两套正则表达式函数库,两者功能相似,只是执行效率略有差异:
一套是由 PCRE(Perl Compatible Regular Expression) 库提供的。使用“preg_”为前缀命名的函数;
PCRE来源于Perl语言,而Perl是对字符串操作功能最强大的语言之一,PHP的最初版本就是由Perl开发的产品。 4. 正则表达式的组成在PHP中,一个正则表达式分为三个部分:分隔符、表达式和模式修饰符。 分隔符
分隔符可以使用除字母、数字、反斜线(\)和空白字符之外的任意 ascii 字符。 表达式有一些特殊字符和非特殊的字符串组成。是决定正则表达式匹配规则的主要部分。 模式修饰符用于开启和关闭某些特定的功能/模式。 二、分隔符1. 分隔符的选择
当使用 PCRE 函数的时候,正则表达式必须由分隔符闭合包裹。 /foo bar/ (合法) #^[^0-9]$# (合法) +php+ (合法) %[a-zA-Z0-9_-]% (合法) #[a-zA-Z0-9_-]/ (非法,两边的分隔符不同) a[a-zA-Z0-9_-]a (非法,分隔符不能是字母) \[a-zA-Z0-9_-]\ (非法,分隔符不能是反斜线(`\`)) 除了上面提到的分隔符,也可以使用括号样式的分隔符,左括号和右括号分别作为开始和结束 分隔符。 {this is a pattern} 2. 分隔符的使用
如果分隔符 在正则表达式中使用,它必须使用反斜线(\)进行转义。 /http:\/\// #http://# 需要将一个字符串放入正则表达式中使用时,可以用 preg_quote() 函数对其进行转义。 它的第二个参数(可选)可以用于指定需要被转义的分隔符。 //在这个例子中,preg_quote($word) 用于保持星号和正斜杠(/)原文涵义,使其不使用正则表达式中的特殊语义。 $textBody = "This book is */very/* difficult to find."; $word = "*/very/*"; $reg = "/" . preg_quote($word, '/') . "/"; echo $reg; // 输出 '/\*\/very\/\*/' echo preg_replace ($reg, "<i>" . $word . "</i>", $textBody); // 输出 'This book is <i>*/very/*</i> difficult to find.'
可以在结束分隔符后面增加模式修饰符来影响匹配效果。 #[a-z]#i 三、元字符1. 转义符
2. 定位符
3. 限定符
4. 通用字符
5. 非打印字符
6. 多选分支符
7. 字符组
8. 非贪婪匹配符
9. ( )分组
四、模式修饰符1. i(不区分大小写)如果设置了这个修饰符,正则表达式中的字母会进行大小写不敏感匹配。 2. m(多行模式)
默认情况下,PCRE 认为目标字符串是由单行字符组成的(然而实际上它可能会包含多行)。 当这个修饰符设置之后,“行首”元字符 (^) 和“行末”元字符 ($) 就会匹配目标字符串中任意换行符之前或之后,另外,还分别匹配目标字符串的最开始和最末尾位置。 如果目标字符串 中没有 "n" 字符,或者正则表达式中没有出现 ^ 或 $,设置这个修饰符不产生任何影响。 3. s(点号通配模式)
默认情况下,点号(.)不匹配换行符。 4. U(贪婪模式)这个修饰符与前面提到的 ? 作用相同,使正则表达式默认为非贪婪匹配,通过量词后紧跟 ? 的方式可以使其转为贪婪匹配。 在非贪婪模式,通常不能匹配超过 pcre.backtrack_limit 的字符。 贪婪模式$str = '<b>abc</b><b>def</b>'; $pattern = '/<b>.*</b>/'; preg_replace($pattern, '\\1', $str); .*会匹配 abc</b><b>def 非贪婪模式方法一、使用 ? 转为非贪婪模式 $str = '<b>abc</b><b>def</b>'; $pattern = '/<b>.*?</b>/'; preg_replace($pattern, '\\1', $str); .*会分别匹配 abc,def 方法二、使用修饰符 U 转为非贪婪模式 $str = '<b>abc</b><b>def</b>'; $pattern = '/<b>.*</b>/U'; preg_replace($pattern, '\\1', $str); 5. u(支持UTF-8转义表达)
此修正符使正则表达式和目标字符串都被认为是 utf-8 编码。 $str = '中文'; $pattern = '/^[\x{4e00}-\x{9fa5}]+$/u'; if (preg_match($pattern, $str)) { echo '该字符串全是中文'; } else { echo '该字符串不全是中文'; } 6. D(结尾限制)
默认情况下,如果使用 $ 限制结尾字符,当字符串以一个换行符结尾时, $符号还会匹配该换行符(但不会匹配之前的任何换行符)。 7. x如果设置了这个修饰符,正则表达式中的没有经过转义的或不在字符类中的空白数据字符总会被忽略, 并且位于一个未转义的字符类外部的#字符和下一个换行符之间的字符也被忽略。 8. A如果设置了这个修饰符,正则表达式被强制为"锚定"模式,也就是说约束匹配使其仅从 目标字符串的开始位置搜索。 9. S
当一个正则表达式需要多次使用的时候,为了得到匹配速度的提升,值得花费一些时间对其进行一些额外的分析。 五、反向引用
使用 ( ) 标记的开始和结束的多个原子,不仅是一个独立的单元,也是一个子表达式。 1. 在正则表达式中使用反向引用(sens|respons)e and \1ibility 将会匹配 ”sense and sensibility” 和 ”response and responsibility”, 而不会匹配 ”sense and responsibility” 2. 在PCRE函数中使用反向引用<?php $str = '<b>abc</b><b>def</b>'; $pattern = '/<b>(.*)<\/b><b>(.*)<\/b>/'; $replace = preg_replace($pattern, '\\1', $str); echo $replace . "\n"; $replace = preg_replace($pattern, '\\2', $str); echo $replace . "\n"; 输出: abc def 六、正则表达式常用PCRE函数PHP官网的讲解已经很详细了,这里不再做多余的论述 执行正则表达式匹配 preg_match()执行正则表达式全局匹配 preg_match_all()执行一个正则表达式的搜索和替换 preg_replace()执行一个正则表达式搜索并且使用一个回调进行替换 preg_replace_callback()执行多个正则表达式搜索并且使用对应回调进行替换 preg_replace_callback_array()通过一个正则表达式分隔字符串 preg_split()七、应用实践1. 正则表达式匹配中文
UTF-8汉字编码范围是 0x4e00-0x9fa5
UTF-8要使用 u模式修正符 使模式字符串被当成 UTF-8 UTF-8<?php $str = '中文'; $pattern = '/[\x{4e00}-\x{9fa5}]/u'; preg_match($pattern, $str, $match); var_dump($match); ANSI(GB2312)<?php $str = '中文'; $pattern = '/['.chr(0xb0).'-'.chr(0xf7).']['.chr(0xa1).'-'.chr(0xfe).']/'; preg_match($pattern, $str, $match); var_dump($match); 2. 正则表达式匹配页面中所有img标签中的src的值。<?php $str = '<img alt="高清大图" id="color" src="color.jpg" />'; $pattern = '/<img.*?src="(.*?)".*?\/?>/i'; preg_match($pattern, $str, $match); var_dump($match); (责任编辑:IT) |