## 4-2. 元字符
>[info] 元字符是修饰原子字符的,可以理解为原子的定语或限定条件
* 举个生活中的小例子:戴帽子的男生
* 其中【戴帽子的】就是【元字符】;
* 那个【男生】,就是【原子】。
* * * * *
* 注意二点:
1. 元字符不允许单独使用,必须配合原子,共同工作;
2. 如果原子中包括元字符,必须在元字符加`'\'`进行转义。
* * * * *
### 元字符种类(共15个)
>[info] 元字符尽管看上去很多,其实不少是成对出现,不难记忆,别被吓住了~
| 序号 | 元字符 | 说明 |举例|
| :---: | :---: | --- |--- |
| 1 | * | 匹配0次、1次或多次前面原子,等价于`{0,} ` | `'/Go*gle/' ` |
| 2 | + | 匹配1次或多次前面原子,等价于`{1,} ` | `'/Go+gle/' ` |
| 3 | ? | 匹配0次或1次前面原子,等价于`{0,1}` | `'/Go?gle/' ` |
| 4 | . | 匹配除换行符之外的任意一个字符 | `'/Go.gle/' ` |
| 5 | \| | 匹配2个或多个分支 | `/Google\|Baidu/` |
| 6 | {n} | 表示前面原子出现n次 | `/Go{2}gle/` |
| 7 | {n,} | 表示前面原子出现不少于n次 | `/Go{2,}gle/` |
| 8 | {n,m} | 表示前面原子至少出现n次,最多出现m次 | `/Go{2,5}gle/` |
| 9 | ^ | 匹配字符串开始位置 | `/^php/` |
| 10 | $ | 匹配字符串开始位置 | `/php$/` |
| 11 | \b | 匹配单词边界 | `/\bphp/` |
| 12 | \B | 匹配除单词边界以外的部分 | `/\Bphp/` |
|13 | [ ] | 匹配方括号内指定的任意一个原子 | `/[aj]sp/` |
| 14 | [^ ] | 匹配除方括号内指定原子以外的任意一个原子 |`/[^aj]sp/` |
| 15 | ( ) | 匹配其整体为一个原子[模式单元],即多个原子组成的大原子 | `/(Think)+PHP/` |
* * * * *
### 模式匹配优先级问题:
| 优先级 | 元字符 | 描述 |
| :---: | :---: | --- |
| 1 | \ | 转义字符 |
| 2 | ( ),(?:),(?=),[ ] | 模式单元与原子表 |
| 3 | *,+,?,{n},{n,},{n,m} | 重复匹配 |
| 4 | ^,$,\b,\B | 边界匹配 |
| 5 | \| | 模式选择 |
* * * * *
### 实例演示:
>[info] 代码说明,都写在注释中了
~~~
<?php
//*匹配前面0次,1次或多次前面原子
echo preg_match('/Go*gle/', 'Ggle') ? '匹配成功<br />' : '匹配失败<br />';
//?匹配0个或1个原子
echo preg_match('/Go?gle/', 'Gogle') ? '匹配成功<br />' : '匹配失败<br />';
//+匹配1个或多个原子
echo preg_match('/Go+gle/', 'Google') ? '匹配成功<br />' : '匹配失败<br />';
//.匹配G和g之间的任意一个字符
echo preg_match('/G.g/', 'Gogle') ? '匹配成功<br />' : '匹配失败<br />';
// | 匹配多个分支
echo preg_match('/google|baidu/', 'baidu') ? '匹配成功<br />' : '匹配失败<br />';
//^设置开头$设置结尾,精确匹配
echo preg_match('/^google$/', 'google') ? '匹配成功<br />' : '匹配失败<br />';
//{n} n表示前面原子出现的次数
echo preg_match('/go{2}gle/', 'google') ? '匹配成功<br />' : '匹配失败<br />';
//{n,} n表示前面原子至少要出现的次数,本例中,字符’o‘至少要出现2次
echo preg_match('/go{2,}gle/', 'gooogle') ? '匹配成功<br />' : '匹配失败<br />';
//{n,m} n表示前面原子至少要出现的次数,m表示最多出现次数,本例中,字符’o‘至少要出现2次,最多5次
echo preg_match('/go{2,5}gle/', 'gooooogle') ? '匹配成功<br />' : '匹配失败<br />';
// \b匹配单词边界,本例 ThinkPHP右边为边界不应再有内容
echo preg_match('/PHP\b/', 'ThinkPHP 5.0') ? '匹配成功<br />' : '匹配失败<br />';
// \B匹配除单词边界以外部分,本例 Think PHP右边不能有边界,左边必须要有边界
echo preg_match('/\bPHP\B/', 'Think PHP5.0') ? '匹配成功<br />' : '匹配失败<br />';
~~~
* * * * *
### 总结:
>[success] 元字符是正规表达式中的一个重点,也是难点,大家多上机练习一下。