[TOC]
正则表达式(Regular Expression,在代码中常简写为regex、regexp或RE)是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。许多程序设计语言都支持利用正则表达式进行字符串操作。 在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。
简单来说正则表达式就是完成字符串的增、删、改、查
## 应用场合
数据验证、文本替换、内容检索、过滤内容
可以理解为:执行字符串函数无法完成的特殊的匹配、拆分、 替换功能
## 定界符
正则表达式语句需要由分隔符(定界符)闭合包裹,分隔符可以使任意非 字母数字, 非反斜线, 非空白字符
经常使用的分隔符是正斜线(/), hash符号(#) 以及取反符号(~)。
建议使用//做为定界符,因为和js一致
实例
~~~
<?php
$preg= "/xuebingsi/";
$c = preg_match($preg,"学并思网址xuebingsi.com");
echo $c;
?>
~~~
## 原子(元字符)
原子是正则表达式中的最小的元素,包括英文、标点符号等
### 原子构成方式
普通字符是编写正则表达式时最常见的原子了,包括所有的大写和小写字母字符、所有数字等
一些特殊字符和元字符作为原子,统统使用`"\"`转义字符进行转义即可。
在正则表达式中可以直接使用一些系统提供的代表范围的原子,如下面的表格所示:
<table class="jbborder">
<tbody>
<tr>
<td>
代表范围的原子
</td>
<td>
说明
</td>
<td>
自定义原子表示法
</td>
</tr>
<tr>
<td>
\d
</td>
<td>
表示任意一个十进制的数字
</td>
<td>
[0-9]
</td>
</tr>
<tr>
<td>
\D
</td>
<td>
表示任意一个除数字这外的字符
</td>
<td>
[^0-9]
</td>
</tr>
<tr>
<td>
\s
</td>
<td>
表示任意一个空白字符,空格、\n\r\t\f
</td>
<td>
[\n\r\t\f ]
</td>
</tr>
<tr>
<td>
\S
</td>
<td>
表示任意一个非空白
</td>
<td>
[^\n\r\t\f ]
</td>
</tr>
<tr>
<td>
\w
</td>
<td>
表示任意一个字 a-zA-Z0-9_
</td>
<td>
[a-zA-Z0-9_]
</td>
</tr>
<tr>
<td>
\W
</td>
<td>
表示任意一个非字,除了a-zA-Z0-9_以外的任意一个字符
</td>
<td>
[^a-zA-Z0-9_]
</td>
</tr>
</tbody>
</table>
### 自定义原子表([])作为原子
在一组字符中匹配某个元字符,在正则表达式中通过元字符表来完成,就 是放到[..](方括号)中
<table class="dataintable">
<tbody><tr>
<th style="width:20%">表达式</th>
<th>描述</th>
</tr>
<tr>
<td><a>[abc]</a></td>
<td>查找方括号之间的任何字符。</td>
</tr>
<tr>
<td><a>[^abc]</a></td>
<td>查找任何不在方括号之间的字符。</td>
</tr>
<tr>
<td>[0-9]</td>
<td>查找任何从 0 至 9 的数字。</td>
</tr>
<tr>
<td>[a-z]</td>
<td>查找任何从小写 a 到小写 z 的字符。</td>
</tr>
<tr>
<td>[A-Z]</td>
<td>查找任何从大写 A 到大写 Z 的字符。</td>
</tr>
<tr>
<td>[A-z]</td>
<td>查找任何从大写 A 到小写 z 的字符。</td>
</tr>
<tr>
<td>[adgk]</td>
<td>查找给定集合内的任何字符。</td>
</tr>
<tr>
<td>[^adgk]</td>
<td>查找给定集合外的任何字符。</td>
</tr>
<tr>
<td>(red|blue|green)</td>
<td>查找任何指定的选项。</td>
</tr>
<tr>
<td>.</td>
<td>点在正则中表示除换行符外的任意字符</td>
</tr>
</tbody></table>
**实例**
~~~
<?php
$str ="1.jpg@2.jpg@3.jpg#4.jpg";
$preg="/[@#]/";
$c = preg_match($preg,$str);
var_dump($c);
?>
~~~
## 原子组(元字符组)
>[success]如果一次要匹配多个元子,可以通过元子组完成
原子组不原子表的差别在于原子组一次匹配多个元子,而原子表则 是匹配成功表中的一个元字符就可以
元字符组用()表示
组号是从 左到右计数的调用时: 这种方式我们叫做反向引用
**实例**
~~~
<?php
$str = "学并思官网www.xuebingsiwang.com学并思论坛 http://bbs.xuebingsiwang.com我在学并思的网名叫xuebingsi";
$preg = "/(xuebingsi)wang/is";
$newStr= preg_replace($preg,"<span style='color:#f00'>$1</span>wang",$str);
echo $newStr;
?>
~~~
## 选择修释符
>[success]| 这个符号带表选择修释符,也就是 | 左右两侧有一个匹配到就可以
实例
~~~
<?php
$str = "http://www.baidu.com不新浪网http://www.sina.com";
$preg = "/\.(baidu|sina)\./";
$new_str = preg_replace($preg,'.xuebingsiwang.',$str);
?>
~~~
## 重复匹配(量词)
>[success]如果要重复匹配一些内容时我们要使用重复匹配修饰符,包括以下几种
<table class="dataintable">
<tbody>
<tr>
<th style="width:20%">
量词
</th>
<th>
描述
</th>
</tr>
<tr>
<td>
<a>
*
</a>
</td>
<td>
重复零次或更多次
</td>
</tr>
<tr>
<td>
<a>
+
</a>
</td>
<td>
重复一次或更多次
</td>
</tr>
<tr>
<td>
<a>
?
</a>
</td>
<td>
重复零次或一次
</td>
</tr>
<tr>
<td>
<a>
{n}
</a>
</td>
<td>
重复n次
</td>
</tr>
<tr>
<td>
<a>
{n,}
</a>
</td>
<td>
重复n次或更多次
</td>
</tr>
<tr>
<td>
<a>
{n,m}
</a>
</td>
<td>
重复n到m次
</td>
</tr>
</tbody>
</table>
因为正则最小单位是元字符,而我们很少只匹配一个元字符如a、b所以基 本上重复匹配在每条正则语句中都是必用到的内容
## 禁止重复匹配
>[success]正则表达式在进行重复匹配时,默认是贪婪匹配模式,也就是说会尽量匹配更多内容,但是有的时候我们并不希望他匹配更多内容,这时可以通过? 进行修饰来禁止重复匹配
<table class="dataintable">
<tbody>
<tr>
<th style="width:20%">
量词
</th>
<th>
描述
</th>
</tr>
<tr>
<td>
<a>
*?
</a>
</td>
<td>
重复零次或更多次,但尽可能少重复
</td>
</tr>
<tr>
<td>
<a>
+?
</a>
</td>
<td>
重复一次或更多次,但尽可能少重复
</td>
</tr>
<tr>
<td>
<a>
??
</a>
</td>
<td>
重复零次或一次,但尽可能少重复
</td>
</tr>
<tr>
<td>
<a>
{n}?
</a>
</td>
<td>
重复n次,但尽可能少重复
</td>
</tr>
<tr>
<td>
<a>
{n,}?
</a>
</td>
<td>
重复n次或更多次,但尽可能少重复
</td>
</tr>
<tr>
<td>
<a>
{n,m}?
</a>
</td>
<td>
重复n到m次,但尽可能少重复
</td>
</tr>
</tbody>
</table>
## 匹配字符边界
>[success]如果想匹配字符的边界,边界包括空格、标点符号、换行等,可以使用正则表达式的匹配字符边界修饰符如下
1. ^匹配字符串的开始
2. $匹配字符串的结束,忽略换行符\n
## 模式修正符
>[success]正则表达式在执行时会按他们的默认执行方式进行,但有时候默认的处理方式总不能满足我们的需求,所以可以使用模式修正符更改默认方式。
1. i不区分大小写字母的匹配
2. s将字符串视为单行,换行符做普通字符看待,使“.” 匹配任何字符
3. 常用正则操作函数
## preg_match()方法
>[success]执行一个正则表达式匹配
**语法:**
`int preg_match ($pattern , $subject) `
## preg_match_all()方法
>[success]执行一个全局正则表达式匹配
**语法:**
`int preg_match_all ($pattern ,$subject [, array &$matches])`
matches多维数组,作为输出参数输出所有匹配结果, 数组排序通过flags指定。
## preg_split()方法
>[success]通过一个正则表达式分隔字符串
**语法:**
`array preg_split ( string $pattern , string $subject)`
## preg_replace()方法
>[success]执行一个正则表达式的搜索和替换
**语法:**
`mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject)`
>[danger] 练习:搞懂邮箱,手机,身份证,网址等等正则,采集拉勾网招聘职位数据
- 序言
- 第一章:准备工作
- 写在学习之前的话
- web应用开发结构
- 开发工具/环境
- 第二章:展现层面(HTML/CSS)
- HTML简介
- HTML基础
- HTML编码
- HTML链接
- HTML图像
- HTML列表
- HTML表单
- HTML表格(分水岭)
- HTML 实体
- HTML框架
- CSS层叠样式表
- CSS选择器
- CSS文本/字体
- CSS继承和叠加
- CSS框模型
- CSS浮动(分水岭)
- CSS定位
- CSS背景
- CSS图标字体
- CSS补充
- 开发技巧
- 第三章:展现层面(Javascript)
- JS简介
- JS实现
- JS输出交互
- JS变量
- JS数据类型
- JS运算符
- JS流程控制(分水岭)
- JS函数
- JS数组
- JS对象(分水岭)
- JS数组对象
- JS字符串对象
- JS数学对象
- JS日期对象
- JS BOM对象(分水岭)
- JS DOM对象
- JS事件对象
- JS元素对象
- JS DOM节点
- 第四章:展现层面(Jquery)
- JQ简介
- JQ使用
- JQ选择器
- JQ筛选
- JQ属性
- JQ-CSS
- JQ事件
- JQ文档处理
- JQ效果
- JQ-ajax
- 第五章:逻辑/业务层面(PHP)
- PHP简介
- PHP变量
- PHP数据类型
- PHP常量
- PHP运算符
- PHP流程控制
- PHP函数(分水岭)
- PHP日期
- PHP数学
- PHP数组
- PHP字符串
- PHP正则表达式(分水岭)
- PHP目录操作
- PHP文件
- PHP上传/下载
- PHP面向对象(分水岭)
- PHP图像处理
- PHP会话控制
- Ajax异步处理
- PHPMysql扩展
- PHPMysqli扩展
- PHPPdo扩展
- PHP接口
- PHP命名空间
- 第六章:逻辑/业务层面(框架设计)
- 第七章:存储层面(mysql)
- Mysql基础
- Mysql Sql简介
- Mysql数据库
- Mysql数据类型
- Mysql数据表
- Mysql操作记录
- Mysql查询
- Mysql修改表结构
- Mysql日期与时间
- Mysql分组统计
- Mysql多表查询
- Mysql安全
- Mysql存储引擎
- Mysql事务
- Mysql视图
- Mysql触发器
- Mysql存储过程
- Mysql存储函数
- Mysql优化
- 第八章:服务器(Linux)
- Linux介绍与安装
- Shell
- 目录与文件操作
- VIM编辑器使用
- 帐号管理
- SUDO
- 权限控制
- 压缩与打包
- 软件安装
- 计划任务
- 进程管理
- 宝塔Linux面板