## 原子 >[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] 以上实例很简单,建议上机练习一下~~