特殊字元表示法
| 表示法 | 說明 | ASCII |
|---|---|---|
| \a | alert | x07 |
| \b | backspace | x08 |
| \e | ESC | x1B |
| \n | newline | x0A |
| \r | 回列首(Carriage Return) | x0D |
| \f | 換頁(Form Feed) | x0C |
| \t | tab | x09 |
| \octal | octal為三位數的8進位數字 | |
| \xhex | hex 為一位或二位的16進位數字 | |
| \x{hex} | hex 為任何有效的16進位數字 |
PHP的Character Classes (Character Sets)
| Character | 說明 |
|---|---|
| [...] | 在列舉的範圍內 |
| [^...] | 不在列舉的範圍內 |
| [:class:] | POSIX的字元類組(POSIX character classes) |
| . | 任何字元,\n 除外(除非在 /s 單列模式下) . 在[]中,只代表單純的.字元,所以若要匹配所有字元,可用[\s\S] |
| \C | 單一位元組。(Unicode有問題?) |
| \w | 字詞字元。即 [a-zA-Z0-9_] |
| \W | 非字詞字元。即 [^a-zA-Z0-9_] |
| \d | 數字。即 [0-9] |
| \D | 非數字。即 [^0-9] |
| \s | 空白字元。即[\n\r\f\t ] |
| \S | 非空白字元。即[^\n\r\f\t ] |
Anchoring Metacharacters
| Character | 說明 |
|---|---|
| ^ | 字串開頭 或每一行開頭(任何 \n 之後)(在 /m 多列模式下)。 |
| $ | 字串結尾 或每一行結尾(任何 \n 之前)(在 /m 多列模式下)。 |
| \Z | 字串結尾或每一行結尾(任何 \n 之前) 不管哪一種模式。 |
| \A | 只比對字串開頭。 不管哪一種模式。 |
| \z | 字串結尾 不管哪一種模式。 |
| \G | 目前的比對起點 |
| \b | word boundary,介於 \w 與 \W 之間位置,以及字串開頭與結尾。 |
| \B | 非word boundary |
| (?=...) | Positive lookahead |
| (?!...) | Negative lookahead |
| (?<=...) | Positive lookbehead |
| (?<!...) | Negative lookbehead |
Pattern Modifiers
http://php.net/manual/en/reference.pcre.pattern.modifiers.php
| modifiers | 說明 |
|---|---|
| i | 不區分大小寫 |
| m | 多列模式 |
| s | 單列模式 |
| x | 忽略空白字元,允許出現「#..」註解 |
| U | 反轉貪多(greedy)性質,「*」變成不貪多,「*?」變成貪多。 |
| A | 強制從字串起點開始比對 |
| D | 強制「$」代表字串結尾,而非「\n」之前的位置。 (m多列模式效力大於此模式) |
| u | 將正規式與受測字串都視為UTF8 |
| (?mode) | 以指定的 mode 比對後續樣式。mode 為 imsxU 有效組合。 |
| (?-mode) | 取消 mode 對後續樣式的影響。mode 為 imsxU 有效組合。 |
| (?mode:...) | 以指定的 mode 比對括弧內的樣式。mode 為 imsx 有效組合。 |
| (?-mode:...) | 取消 mode 對括弧內樣式的影響。mode 為 imsx 有效組合。 |
其他
| 語法 | 說明 |
|---|---|
| \Q...\E | \Q 到 \E 中間所有中介符號都視為一般字元。 |
| (?#...) | 將子字串視為註解 |
| #... | x 模式下,# 到列尾視為註解 |
| (...) | 子樣式,並將符合子樣式的字串儲存於 \1、\2...變數 |
| \n | 符合第 n 組子樣式的字串。 |
| (?P<name>...) | 子樣式,並將符合子樣式的字串儲存於 \name 變數 |
| \name | 符合名稱為 name 子樣式的字串。 |
| (?:...) | 子樣式,但不儲存於 \1、\2...變數 |
| (?>...) | 禁止符合字串被回步 |
| ...|... | OR |
| * | 0次以上 (貪多) 範例: 原字串:abbbcc 正規式:ab* 結果:abbb (貪多,以多為優先) |
| + | 1次以上 |
| ? | 0次或1次 |
| {n} | 剛好n次 |
| {n,} | n次以上 |
| {x,y} | x次~y次 |
| *? | 0次或多次,以少為優先 範例: 原字串:abbbcc 正規式:ab*? 結果:a (不貪多,以少為優先) |
| +? | 1次或多次,以少為優先 |
| ?? | 0次或1次,以少為優先 |
| {n,}? | n次以上,以少為優先 |
| {x,y}? | x次~y次,以少為優先 |
| *+ | 0次或多次,不回步(backtracking) |
| ++ | 1次或多次,不回步 |
| ?+ | 0次或1次,不回步 |
| {n}+ | 剛好n次,不回步 |
| {n,}+ | n次以上,不回步 |
| {x,y}+ | x次~y次,不回步 |
| (?(condition)...|...) | if-then-else。 condition:子樣式儲存邊號、lookahead、lookbehind |
| (?(condition)...) | if-then。 condition:子樣式儲存邊號、lookahead、lookbehind |
範例1:
$str = "/ABC/20151201/123456.txt";
if (1 !== preg_match('/^\/.+\/([\d]{4})([\d]{2})([\d]{2})\//', $str, $matches)) {
throw new \Exception("分析失敗");
}
var_dump($matches);
結果
rray(4) {
[0]=>
string(14) "/ABC/20151201/"
[1]=>
string(4) "2015"
[2]=>
string(2) "12"
[3]=>
string(2) "01"
}
範例2:
找出英文數字中,同一個字元,重複3次以上的資料
$str = "ggffffffasd1222233GGGfHHHH";
preg_match_all("/([a-zA-Z0-9])\\1{2,}/", $str, $matches);
var_dump($matches);
結果
array(2) {
[0]=>
array(4) {
[0]=>
string(6) "ffffff"
[1]=>
string(4) "2222"
[2]=>
string(3) "GGG"
[3]=>
string(4) "HHHH"
}
[1]=>
array(4) {
[0]=>
string(1) "f"
[1]=>
string(1) "2"
[2]=>
string(1) "G"
[3]=>
string(1) "H"
}
}
範例3:
將英文數字同一個字元重複3次以上的地方,取代為只留一個字元
$str = "ggffffffasd1222233GGGfHHHH";
$res = preg_replace('/([a-zA-Z0-9])\\1{2,}/', '$1', $str);
var_dump($res);
結果
string(13) "ggfasd1233GfH"
參考:
http://www.php.net/manual/en/book.pcre.php
http://www.php.net/manual/en/reference.pcre.pattern.syntax.php
http://www.regular-expressions.info/reference.html
RegexOne - Learn Regular Expressions - PHP
非常有用的資訊,感謝!
回覆刪除