PHP 字串樣板 - fantasy0107/notes GitHub Wiki

相關 php method

  1. preg_match - Perform a regular expression match - 取出符合樣式的子字串 - 比對
  2. preg_match_all - Perform a global regular expression match - 分割
  3. preg_split - 用符合樣式的子字串分割原字串
  4. preg_replace - Perform a regular expression search and replace - 取代
  5. preg_grep - 回傳符合樣式的字串陣列 - 過濾
  6. preg_quote - 會建立對應到特定字串的樣板 - 轉譯

作用

  1. 比對(也可用於從字串抽出資訊)
  2. 把比對出來的文字替換為新文字
  3. 把字串分作小段置於陣列

基本單元

  • 一組在字串的合法字元(字母, 數字, 特定的標點符號)
  • 另一組可選用的字串(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編碼解讀符合樣板