php中文网 | cnphp.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: php 视频教程
查看: 169|回复: 0

7、正则表达式

[复制链接]

58

主题

58

帖子

413

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
413
发表于 2021-5-2 22:19:04 | 显示全部楼层 |阅读模式
[TOC]
## 使用原则 ##
可以使用函数处理就不要使用正则表达式, 正则表达式的效率比函数低, 主要用于处理复杂字符串
## 格式 ##
/   原子和元字符  /模式修正符
## 特点 ##
正则表达式是一串字符串, 由含有特殊意义的字符组成, 可以看做一种语言, 只有在函数中使用才能发挥作用
## 分类 ##
- 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(): 替换字符串, 不区分大小写
- implode(): 字符串拼接, 相当于 +, 该函数为 join() 的别名



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|php中文网 | cnphp.com

GMT+8, 2021-5-17 18:09 , Processed in 0.025876 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表