## 原子
>[info] 原子,也叫原子字符,<span style="color:#f80;">是正规表达式函数操作的对象。</span><br/>
学习之前先搞清三个概念:
<div style="border:2px solid #f80;padding:10px;margin-bottom:15px;">
1. 原子是正则表达式的最小单位;<br/>
2. 每个正则模式中,至少要包含一个原子;<br/>
3. 原子必须由可打印和非打印字符组成。
</div>
* * * * *
## 原子的组成:
>[info] 大体上,可以将原子字符分为5类:
| 序号 | 原子 | 说明 |
| :---: | --- | --- |
| 1 | 普通字符 | 可打印字符,如大小写字母、数字等 |
| 2 | 特殊字符或元字符 | 因为这类字符在正则表达式中有特殊含义,必须转义 |
| 3 | 非打印字符 | 即存在但不可显示字符,如回车、换行、换页,制表符等|
| 4 | 通配字符 | 也叫:通用字符或者'类字符',即一个原子匹配一类字符 |
| 5 | 自定义字符 | 可以是一个,也可以是集合,用方括号'[ ]'包起来 |
>[success] 下面我们详细介绍一下这五类原子:
#### 1. 普通字符做原子:
>[info] 普通字符:就是我们可以在屏幕上看见的字符,如字母、数字等。
| 序号 | 原子字符 | 说明 |
| :---: | --- | --- |
| 1 | 小写字母/`'a-z'` | `/php/ , /abc/,/google/` |
| 2 | 大写字母/`'A-Z'` | `/THINKPHP/, /CHINA/` |
| 3 | 数字/`'0-9'` | ` /3.14/, /18/ ` |
>[warning] 一个原子匹配目标字符串中的一个字符,逐一对应。
* 实例:
~~~
<?php
echo preg_match('/php/', 'thinkphp') ? '匹配成功<br />' : '匹配失败<br />'; //匹配成功
echo preg_match('/PHP/', 'ThinkPHP') ? '匹配成功<br />' : '匹配失败<br />'; //匹配成功
echo preg_match('/5/', 'ThinkPHP5') ? '匹配成功<br />' : '匹配失败<br />'; //匹配成功
~~~
* * * * *
#### 2. 特殊字符和元字符做原子:
>[info] 元字符在正则中有特殊用途,是用来修饰原子的,下节课会详细讨论,这里你只需要知道,元字符做原子时,不能直接使用,<span style="color:#f80">必须转义</span>,使其变成普通原子字符。
| 序号 | 原子字符 | 说明 |
| :---: | --- | --- |
| 1 | 元字符 | `'\.', '\+', '\?', '\$', '\*' ` |
| 2 | 特殊字符 | `'\<br \/>' ` 匹配是否出现`‘<br />’`标记|
* 实例:
~~~
<?php
echo preg_match('/\./', 'ThinkPHP5.0') ? '匹配成功<br />' : '匹配失败<br />'; //匹配成功
//<br /> 需要3次转义:2个尖括号'<'和'>',1个反斜杠'/'
echo preg_match('/\<br\/\>/', 'ThinkPHP5<br/>') ? '匹配成功<br />' : '匹配失败<br />';//匹配成功
~~~
* * * * *
#### 3. 非打印字符做原子:
>[info] 非打印字符,也叫不可见字符,主要是一年格式控制符。
* 最常用的有四个:
| 序号 | 原子字符 | 说明 |
| :---: | --- | --- |
| 1 | ` '\n' ` | 匹配一个换行符,等价于:`'\x0a' ` |
| 2 | `'\r' ` | 匹配一个回车符,等价于:`'\x0d' ` |
| 3 | `'\f' ` | 匹配一个换页符,等价于:`'\x0c'` |
| 4 | ` '\t' ` | 匹配一个制表符,等价于:`'\x09'` |
| 5 | ` '\v' ` | 匹配一个垂直制表符,等价于:`'\x0b'` |
* 实例:
~~~
<?php
echo preg_match('/\r\n/', "ThinkPHP5.0\r\n") ? '匹配成功<br />' : '匹配失败<br />';//匹配成功
~~~
>[info] 代码分析:
1. 目标字符串`"ThinkPHP5.0\r\n"`必须要用双引号""包起来,因为只有双引号里的字符串才可以解析所有转义字符;
2. 单引号内只解析2种:单引号自身`'\' `和 转义符自身`\\`
>[warning] 不可见,不代表不存在。不可见字符仅仅是无法用肉眼看见,但可以感知存在。
* * * * *
#### 4. 通配字符做原子:
>[info] 通配字符,也叫通用字符、类字符。我个人觉得叫:类字符更贴切~~
| 序号 | 原子字符 | 说明 |
| :---: | --- | --- |
| 1 | `'\d'` | 匹配任意一个<span style="color:#6cf">十进制数</span>,等价于:`[0-9]` |
| 2 | `'\D'` | 匹配任意一个<span style="color:#6cf">除十进制以外</span>的字符,等价于:`[^0-9]` |
| 3 | `\w` | 匹配任意一个<span style="color:#6cf">字母/数字/下划线</span>字符,等价于:`[a-zA-Z0-9_] ` |
| 4 | `\W` | 匹配任意一个<span style="color:#6cf">除字母/数字/下划线之外</span>的字符,等价于:`[a-zA-Z0-9_] ` |
| 5 | `\s` | 匹配任意一个<span style="color:#6cf">空白字符</span>(非打印),等价于:`[\f\n\r\t\v]` |
| 6 | `\S` | 匹配任意一个<span style="color:#6cf">除空白字符以外</span>的字符,等价于:`[^\f\n\r\t\v]` |
>[warning] ####类原子匹配的是一类字符(字符集合),不再是一个字符~~
* 实例:
~~~
<?php
//匹配十进制数0-9,等价于:[0-9]
echo preg_match('/\d\./', "3.1415926") ? '匹配成功<br />' : '匹配失败<br />';//匹配成功
//匹配大小写字母和下划线,等价于:[a-zA-z0-9_]
echo preg_match('/\w/', "ThinkPHP5.0") ? '匹配成功<br />' : '匹配失败<br />';//匹配成功
//匹配字符串中的空格符,等价于:[\r\n\r\t\v]
echo preg_match('/\s/', "Think PHP5.0") ? '匹配成功<br />' : '匹配失败<br />';//匹配成功
~~~
* * * * *
#### 5. 自定义原子:
>[info] 尽管上面所说的原子已经很丰富了,但不能穷举全部原子类型,如果上面不符合要求,就需要我们自己动手,创建自己的原子啦!
<div style="border:2px solid #f80;padding:10px;margin-bottom:15px;">
1. 自定义原子是一个集合,可以匹配一个,也可以匹配多个字符;<br />
2. 自定义原子列表,使用方括号'[ ]',括号内所有原子地位平等,顺序可随意调整;<br/>
3. 自定义原子列表中,可以使用排除符号'^',过滤掉不符合要求字符。
</div>
| 序号 | 原子 | 说明 |
| :---: | --- | --- |
| 1 | `[单个字符列表] ` | 如:`'\[AJ]SP\'`,表示:ASP和JSP,任选一个做为原子 |
| 2 | `[^单个字符列表] ` | `'^'`:表示取反,如 `'\[^AJ]SP\'`,表示:除ASP和JSP之外,任选一个做为原子 |
| 3 | `[a-zA-Z0-9_]` | 如果原子集合中某类字符是连续的,可以用`'-'`符号连接起始字符,表示字符区间 |
* 实例:
~~~
<?php
//匹配十进制数字: \d
echo preg_match('/[0-9]/', "3.1415926") ? '匹配成功<br />' : '匹配失败<br />';
//匹配大小写字母和十进制数字
echo preg_match('/[a-zA-Z0-9]/', "ThinkPHP5.0") ? '匹配成功<br />' : '匹配失败<br />';
//匹配非打印字符(即不可见字符)
echo preg_match('/[\f\n\r\t\v]/', "Think PHP5.0") ? '匹配成功<br />' : '匹配失败<br />';
//匹配 ASP 或者 JSP,[]内的元素是平级关系,只要一个满足要求就匹配成功
echo preg_match('/[AJ]SP/', "ASP,JSP,PHP") ? '匹配成功<br />' : '匹配失败<br />';
//与上面相反,除了ASP或JSP外的字符串,如:PSP,符合条件,匹配成功
echo preg_match('/[^AJ]SP/', "ASP,JSP,PSP") ? '匹配成功<br />' : '匹配失败<br />';
~~~
* * * * *
#### 总结:
>[success] 原子是正规表达式的中最基本的内容,必须全面掌握,否则会严重影响到后面的学习。
* * * * *
>[danger] 以上实例很简单,建议上机练习一下~~