正则表达式的定义正则表达式就是描述字符排列模式的一种自定义的语法规则。 由于正则表达式本身具有一套非常完整的、可以编写模式的语法体系,提供了一种灵活且直观的字符串处理方法,故正则表达式也称为模式表达式。 正则表达式的特点
例子: "/^https?:\/\/(([a-zA-Z0-9_-])+(\.)?)*(:\d+)?(\/((\.)?(\?)?=?&?[a-zA-Z0-9_-](\?)?)*)*$/i" // 匹配网址URL的正则表达式
"/<(\S*?)[^>]*>.*?<\/\\1>|<.*?/>/i" // 匹配HTML标记的正则表达式
"/\w+([-+.]\w)+*@\w+([-.]\w+)*\.\w+([-.]\w+)*/" // 匹配E-mail地址的正则表达式
"/^<img\s+[^>]*\s*src\s*=\s*([']?)(?<url>\S+)'?[^>l ]*>$/" // 匹配img标签注意
PHP中两套支持正则表达式的函数库
由PCRE库提供,与Perl语言兼容的正则表达式、使用"preg_"为前缀命名的函数,而且表达式都应被包含在定界符中。
自从PHP5.3.0开始废弃.使用一套"ereg_"为前缀命名的函数。 注意1. 两套 函数库功能类似,执行效率不同,一般来说,实现相同功能,使用 PCRE库提供的正则表达式效率略占优势。
2. PCRE 函数需要模式以定界符闭合。
3. 不像POSIX,PCRE 扩展没有专门用于大小写不敏感匹配的函数。
取而代之的是,支持使用i (PCRE_CASELESS) 模式修饰符完成同样的工作。 其他模式修饰符同样可用于改变匹配策略。
4. POSIX 函数从最左面开始寻找最长的匹配,但是 PCRE 在第一个合法匹配后停止。如果字符串
不匹配这没有什么区别,但是如果匹配,两者在结果和速度上都会有差别。 为了说明
这个不同, 考虑下面的例子(来自Jeffrey Friedl 的《精通正则表达式》一书)。
使用模式 one(self)?(selfsufficient)? 在字符串oneselfsufficient 上匹配,
PCRE 会匹配到oneself,但是使用 POSIX,结果将是整个字符串 oneselfsufficient。
两个子串都匹配原始字符串,但是 POSIX 将 最长的作为结果。函数对比
可参照PHP Manual正则表达式语法规则正则表达式描述了一种字符串的匹配模式,通过这个模式在特定的函数中对字符串进行匹配、查找、替换以及分割等操作。 正则表达式作为一个匹配的模板,是由定界符,原子(普通字符,例如a-z)、有特殊功能的字符(称为元字符,例如*、+、?等), 以及模式修正符等部分组成的文字模式。 例子: "/^https?\/\/(([a-zA-Z0-9_-])+(\.)?)*(\d+)?(\/((\.)?(\?)?=?&?[a-zA-Z0-9_-](\?)?)*)*$/i/" 或者 '/^<a.*?(?|\\t|\\r|\\n)?href=[\'"]?(.+?)[\'"]?(?(?|\\t|\\r|\\n)+.*?)?>(.+?)<\/a.*?>$/sim' 1. 定界符中使用的是两个斜线"/",将模式放在它之间说明。
2. 原子用到了<、a、href、=、'、"、/、>等普通字符和\t、\r、\n等转义字符。
3. 元字符使用了[]、()、|、.、?、*、+等具有特殊含义的字符。
4. 用到模式修正符是在定界符最后一个斜线之后的三个字符"s"、"i"、"m"。定界符定界符为PCRE不同于POSIX的特点之一。 除了字母、数字和反斜线以外的字符皆可为定界符 例子:
/<\/w+>/ // 使用反斜线作为定界符号 合法
|(\d{3})-\d+|Sm // 使用竖线"|"作为定界符号 合法
!^(?i)PHP[34]! // 使用感叹号"!"作为定界符 合法
{^\s+(\s+)?$} // 使用花括号"{}"作为定界符号 合法
/href='(.*)' // 非法定界符,缺少结束定界符
1-\d3-\d3-\d4/ // 非法定界符号,缺少起始定界符注意如果没有特殊要求,一般使用 定界符是成对的,有开始符号,也有结束符号。 原子原子是正则表达式中最基本的组成单位,而且在每个模式中最少要包含一个原子。 原子是所有那些未显式指定为元字符的打印(可以在屏幕上输出的字符)和非打印字符(看不到的)组成的。 简单地说,能够在正则表达式中单独使用的字符就可称为原子 将其划分为五类 1. 普通字符作为原子普通字符是编写正则表达式时最常见的原子,包括所有的大写和小写字母字符、所有数字等,例如:a-z、A-Z、0-9。 2. 非打印字符(看不到的)作为原子原子字符 \x09 含义描述
+ \cx 匹配由x指明的控制符。
例如,\c\M匹配一个Control-M或者回车符。x的值必须为A-Z或a-z之一,
否则,将c视为一个原义的'c'字符。
+ \f 匹配一个换页符。等价于\x0c和\cL
+ \n 匹配一个换行符。等价于\x0a和\cJ
+ \r 匹配一个回车符。等价于\x0d和\cM
+ \t 匹配一个制表符。等价于\x09和\cI
+ \v 匹配一个垂直制表符。等价于\x0b和\cK3.通用字符类型做为原子前面介绍的原子,都是一个原子只能匹配一个字符。但是有时候我们需要一个原子可以匹配一类字符。 在正则表达式中可以直接使用一些代表范围的原子 原子字符 含义描述
\d 匹配任意一个十进制数字,等价于[0-9]
\D 匹配任意一个除十进制数字以外的字符,等价于[^0-9]
\w 匹配任意一个数字、字母、下划线,等价于[0-9a-zA-Z_]
\W 匹配除数字、字母、下划线以外的任意一个字符,等价于[^0-9a-zA-Z_]
\s 匹配任意一个空白字符,等价于[\f\t\n\v\r]
\S 匹配除空白字符以外的任何一个字符,等价于[^\t\f\n\v\r]4. 自定义原子表([])作为原子有些时候,上面六个通用字符并不能满足我们的需求,我们需要自定义一类原子,比如说奇数(1,3,5,7,9). 所以这时候需要我们自定义一类原子(称之为类原子),使用原子表"[]"就可以定义一组彼此平等的原子, 只能匹配原子表中一个字符。 1 表示匹配除表内原子外的任意字符,通常称之为排除原子表。 此外,在原子表中可以使用连字符(-)连接一组按照ASCII码顺序排列的原子,可简化书写。 例子 '/[apj]sp/' // 可以匹配asp、jsp、PSP三种,从原子表中仅选择一个作为原子
'/[^apj]sp/' // 可以匹配除了asp、PSP、jsp三种以外的字符串,如xsp,ysp,zsp等
'/0[xX][0-9a-fA-F]/' // 可以匹配一个简单的十六进制数,如0x2f、0X3AE或0x4aB等5. 一些特殊字符和元字符作为原子在正则表达式中,任何一个符号都可以作为原子使用,但如果该符号在正则表达式中有特殊意义,可以使用转义字符"" 取消它的特殊意义,作为一个普通字符使用。 如 " "转义字符可以将有意义的字符转成没意义的字符,还可以将没意义的字符转为有意义的字符 元字符元字符是用于构建正则表达式的具有特殊含义的字符,如"*"、"+"、"?"等。 元字符不能单独出现,必须用来修饰原子。 如果要在正则表达式中使用包含元字符本身,为了使其失去特殊含义,则必须在前面加上""进行转义 正则表达式的元字符元字符 含义描述
\* 匹配0次,1次或者多次其前面的原子
\+ 匹配1次或多次其前的原子
? 匹配0次或者1次其前的原子
. 匹配除了换行符外的任意一个字符
| 匹配两个或多个分支选择
{n} 表示其前面的原子恰好出现n次
{n,} 表示其前面的原子出现不少于n次
{n,m} 表示其前面的原子至少出现n次,最多出现n次
^或\A 匹配输入字符串的开始位置(或在多行模式下行的开头,即紧随一换行符后)
$或\Z 匹配输入字符串(或者在多行模式下行的结尾,即紧随一换行符后)
\b 匹配单词的边界
\B 匹配除单词边界以外的部分
[] 匹配方括号中指定的任意一个原子
[^] 匹配除方括号中的原子以外的任意一个字符,排除原子表
() 匹配其整体为一个原子,即模式单元。可以理解为由多个单个原子组成的大原子
\xn 匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长。
例如,`"\x41"`匹配`A`。`"\x041"`则等价于`"\x04&1"`。正则表达式中可以使用ASCII编码。1. 限定符限定符用来指定正则表达式的一个给定原子必须要出现多少次才能满足匹配。 总共有 其中 注意元字符
2. 边界限制(断言)用来限定字符串或单词的边界范围,以便获得更准确的匹配结果。元字符 "^" 或 ("\A") 和 "$"或 ("\Z") 分别指字符串的开始于结束,而 与之相反的元字符 例如: 有一个字符串 "this is a test", 使用边界限制如下:
"/^this/" 匹配此字符是否以字符串"this"开始的,匹配成功
"/test$/" 匹配此字符是否以字符串"test"结束的,匹配成功
"/\bis\b/" 匹配此字符串中是否含有单词"is",因为在字符串"is"两边都需要有边界
"/\Bis\b/" 查找字符串"is"时,左边不能有边界而右边必须右边界,如"this"匹配成功3. 句号(.)在字符类以外,模式中的圆点可以匹配目标中的任何一个字符,包括不可打印字符。但不匹配换行符号(默认情况下),相当于 但是如果设定了模式修正符 处理圆点与处理^和$是完全独立的,唯一的联系是涉及换行 注意1. `".*?"`或者`".+?"`组合来匹配除换行符以外的任何字符串。
例如:`"/<b>.*?<\/b>/"`可以匹配以`<b>`,`</b>`标签开始于结束的任何不包括换行符的任意字符串4. 模式选择符(|)竖线字符 因 例如: 不表示匹配 也可以像这样使用 5. 模式单元模式单元是使用元字符 一个模式单元中的表达式将被优先匹配 例子: '/(very)*good/' //可以匹配good、very good、very very good 6. 后向引用后向引用是一个正则表达式中一个重要的应用点。 声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除 |