使用原则
可以使用函数处理就不要使用正则表达式, 正则表达式的效率比函数低, 主要用于处理复杂字符串
格式
/ 原子和元字符 /模式修正符
特点
正则表达式是一串字符串, 由含有特殊意义的字符组成, 可以看做一种语言, 只有在函数中使用才能发挥作用
分类
- POSIX 扩展正则表达式函数库: PHP4 中使用, 以 ereg_ 开头
- Perl 兼容正则表达式函数库: PHP5 中使用, 以 preg_ 开头, 推荐使用, 效率高
定界符
“/” 是开始和结束的符号, 除了字母、数字、“” 以外的任意字符都可以是定界符
原子
正则表达式可以单独使用的字符, 就是原子。原子是正则表达式最基本的单位, 正则表达式至少要含有一个原子, 分类如下:
- 打印字符: 可以在屏幕上输出的字符串(字母、数字、特殊符号)
- 非打印字符: 字符串中的格式控制符, 如: “\cx”(x 是控制字符)、“\f”(换页)、“\n”(换行)、“\r”(回车)、“\t”(制表符)、“\v”(垂直制表符) 等等之类的
- 转义字符: 像 *、? 等, 正则表达式赋予了特殊含义, 如果想匹配这类字符串, 需使用转义字符转义
- 表示范围的原子: \d(任意十进制数字)、\D(除任意十进制数外的字符)、\s(任意空白字符)、\S(任意非空白字符)、\w(任意一个字)、\W(与\w相反)
- 自定义原子表(“[]”): 匹配 [] 中的任意一个原子, 不加 [] 是匹配全体原子;使用 - 表示范围, 如: [1-3] 表示匹配 1 或 2 或 3;使用 ^ 匹配非原子表中的原子, ^ 必须放在首位
元字符
用来修饰原子用的, 不能单独使用, 由被正则表达式赋予特殊含义的字符组成, 分类如下:
- 原子出现次数(不设上限则使用贪婪模式): *(出现任意次)、+(至少出现一次)、?(最多出现一次)、{}(自定义原子出现次数: {5}: 出现5次;{5, }: 最少出现 5 次;{5, 10}: 最少出现 5 次, 最多出现 10 次)
- “.”: 表示除换行符外任意字符
- “^”: 放在表达式开头, 表示字符串必须以这个表达式开头, 相当于 “\A”
- “$”: 放在表达式末尾, 表示字符串必须以这个表达式结尾, 相当于 “\Z”
- “|”: 表示或, 优先级最低。如: cat|dog, 匹配的是 cat 或者 dog, 而不是 t 或 d
- “\b”: 表示单词边界。“\bone\b” 表示单词 “one”
- “\B”: 表示非单词边界。“\Bone\B” 匹配的是某个单词里的 “one”
- “()”:
- 把一小串原子当成大原子, 如: (abc)+ 表示 “abc” 至少出现一次
- 改变优先级
- 作为子模式使用。
- 子模式的作用是对匹配完的结果继续匹配, 使用函数的话, 会返回一个数组, 第一个元素是符合正则表达式的结果, 后面依次是每个子模式匹配的结果, 子模式可以嵌套子模式
- 屏蔽子模式的写法: (?: 正则表达式 )
- 反向引用: 使用 “\1” 获取第一个子模式的匹配结果, “\1” 不是转义字符, 所以 “\1” 和 ‘\1’ 等价
模式修正符
在定界符号之外使用的特殊字符
- i: 匹配时不区分大小写
- m: 默认情况, 将字符串视为一行, 加 m 视为多行, ^、$ 视为多行后, 任何一行都可以以正则开始或结束
- s: 表示将字符串视为一行, 换行符变成了一般符号, 可以被 “.” 匹配
- x: 忽略模式中的空白
- A: 必须以正则开头
- Z: 必须以正则结尾
- U: 正则默认使用贪婪模式, 第一个起始标记和最后一个结束标记匹配, 中间就算有结束标记也忽略, 例如表达式为
"<a>.*</a>"
, 字符串为"<a></a></a>"
, 则匹配的结果是"<a></a></a>"
, 而不是"<a></a>"
, 使用 U 可以取消贪婪模式, 从而匹配到"<a></a>"
, 而不是"<a></a></a>"
。在.*、.+
等符号后面加上 ? 也可以取消贪婪模式。如果同时使用 ? 和 U, 则互相抵消, 仍然使用贪婪模式
正则处理函数
- perg_match(): 匹配字符串
- perg_match_all(): 匹配所有字符串
- preg_replace(): 搜索和替换
- preg_split(): 分割字符串
- preg_grep(): 对数组的每个元素进行匹配, 返回正确匹配的单元
- preg_replace_callback(): 用回调函数执行搜索和替换
字符串处理函数
如果能使用字符串处理函数处理的, 就不要用正则, 因为字符串处理函数的效率比正则稍高
- strstr(B, A): 搜索字符串 A 在字符串 B 中第一次出现的位置, 并从这个位置开始返回剩下的字符串(返回时包含字符串 A ), 区分大小写
- stristr(): 作用和 strstr() 一样, 但是不区分大小写
- strpos(): 返回字符串在另一个字符串中第一次出现的位置, 区分大小写
- stripos(): 同 strpos(), 不区分大小写
- strrpos(): 返回字符串在另一个字符串中最后一次出现的位置, 区分大小写
- strripos(): 同 strrpos(), 不区分大小写
- substr(): 将指定字符串从指定位置开始分割, 返回指定位置后面的文本
- str_replace(): 替换字符串, 区分大小写
- str_ireplace(): 替换字符串, 不区分大小写
后面的文本 - str_replace(): 替换字符串, 区分大小写
- str_ireplace(): 替换字符串, 不区分大小写
- implode(): 字符串拼接, 相当于 +, 该函数为 join() 的别名