PHP 字串樣板 - fantasy0107/notes GitHub Wiki
相關 php method
- preg_match - Perform a regular expression match - 取出符合樣式的子字串 - 比對
- preg_match_all - Perform a global regular expression match - 分割
- preg_split - 用符合樣式的子字串分割原字串
- preg_replace - Perform a regular expression search and replace - 取代
- preg_grep - 回傳符合樣式的字串陣列 - 過濾
- preg_quote - 會建立對應到特定字串的樣板 - 轉譯
作用
- 比對(也可用於從字串抽出資訊)
- 把比對出來的文字替換為新文字
- 把字串分作小段置於陣列
基本單元
- 一組在字串的合法字元(字母, 數字, 特定的標點符號)
- 另一組可選用的字串(ex: 'com', 'edut' .....)
- 重複次數(ex: 至少一個但不超過五個字元 )
特殊字元
^ - 開頭為 / 自字元分類[]中代表反向
// ^ - 開頭為cow
preg_match('/^cow/', 'Dave was a cowhand'); // 回傳false
preg_match('/^cow/', 'cowabunga!'); // 回傳true
preg_match('/c[^aeiou]t/', 'Reboot chthon'); // 回傳true
$ - 尾巴為
// $ - 尾巴為 cow
preg_match('/cow$/', 'Dave was a cowhand'); // 回傳false
preg_match('/^cow$/', 'Don't have a cow'); // 回傳true
. - 代表一個字元
// . - 代表一個字元
preg_match('/c.t/', 'cat'); // 回傳true
\ - 回歸字面意義 ex $ ^ .
[] - 字元分類
是不是括號內其中一個字
preg_match('/c[aeiou]t/', 'cat'); // 回傳true => c 後面是否接 a,e,i,o,u 其中一個字元 在接 t
| - 選擇
preg_match('/cat|dog/', 'the cat rubbed my legs'); // 回傳true
重複
? - 0 或 1 次
* - 0次以上
+ - 1次以上
{ n } - 剛好 n次
{ n, m} - 至少n次最多 m 次
{ n, } - 至少 n 次
- 子樣板 ()
- 界定符號
任何非字母 ,數字 ,\ 都可以當界定符號
常見 - () [] {} <>
- # 註解
比對
preg_match('/is (.*)$', 'the key is in my pants', $capture);
// $capture[1] 為 'in my pants'
字元分類
分類 | 說明 | 對應字元 |
---|---|---|
[:alnum:] | 字母與數字 | [0-9a-zA-Z] |
[:alpha:] | 字母 | [a-zA-Z] |
[:ascii:] | 7位元的ASCII | [\x01-\x7F] |
[:blank:] | 水平空白(空格 tab) | [\t] |
[:cntrl:] | 控制字元 | [\x01-\x1F] |
[:digit:] | 數字 | [0-9] |
[:graph:] | 墨水可以印出來的字元(非空白, 非控制字元) | [^\x01-\x20] |
[:lower:] | 小寫字元 | [a-z] |
[:print:] | 可列印字元([:graph:] + 空白 + tab) | [\t\x20-\xFF] |
[:punct:] | 標點符號 | |
[:space:] | 空白(換行 回車 TAB 空格 垂直TAB) | [\n\r\t \x0B] |
[:upper:] | 大寫字母 | [A-Z] |
[:xdigit:] | 16進位數字 | [0-9a-fA-F] |
\s | 空白 | [\r\n \t] |
\S | 非空白 | [^\r\n \t] |
\w | 可用作識別字的字元 | [0-9A-Za-z_] |
\W | 不用作識別字的字元 | [^0-9A-Za-z_] |
\d | 數字 | [0-9] |
\D | 非數字 | [^0-9] |
定位符號
定位符號 | 說明 |
---|---|
^ | 字串開頭 |
$ | 字串結尾 |
:<: | 單字開頭 |
:>: | 單字結尾 |
\b | 單字邊界(表示\w與 \W 之間, 或是指字串開頭或結尾) |
\B | 非單字邊就 (表示 \w 與 \w 之間, 或是 \W 與 \W 之間) |
\A | 字串開頭 |
\Z | 字串尾端 (若 \n 在尾端, 則是指\n的前一個字元) |
\z | 字串尾端 |
^ | 行開頭 (如果設定 /m 旗標, 便也可指 \n 之後) |
$ | 行結尾 (如果設定 /m 旗標, 便也可指 \n 之前) |
數量描述與貪婪模式
符合樣板前提會挑出最長的字
貪婪修飾詞 | 非貪婪修飾詞 |
---|---|
? | ?? |
* | *? |
+ | +? |
{m} | {m}? |
{m,} | {m,}? |
{m,n} | {m,n}? |
未捕捉群組
建立字串樣板無需捕捉到對應的文字
(?:subpattern)
向前引用
使用稍早樣版捕捉的字串 :\1 表示第一個子樣板的對應內容 \2代表第二 ...
preg_match - 最多捕捉 99 個字樣版
修正標記
字串樣板後置入單一字母
標記 | 說明 |
---|---|
/regexp/i | 不區分大小寫 |
/regexp/s | 使英文句點(.) 可代表任何字元包括 \n |
/regexp/x | 忽略空格與註解 |
/regexp/m | ^和$除了原本的功能外, 分別還能對應換行字元 (\n) 之後和之前的位置 |
/regexp/e | 如果要替代的字串是php 程式碼, 要使用 eval() 得到確實的替換字串 |
/regexp/U | 進入非貪婪模式 |
/regexp/u | 以utf8編碼解讀符合樣板 |