## 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] 元字符是正規表達式中的一個重點,也是難點,大家多上機練習一下。