看板 Knuckles_note
作者 Knuckles (站長 那克斯)
標題 [PHP] Regular Expression: Assertions
時間 2011年10月09日 Sun. AM 03:26:15
PCRE regex syntax / Assertions
翻譯一下PHP官方網站對於 assertions 的說明
Assertion 用來表達位置的符號,不會吃掉字元
例如
^ : 符合整個字串的開頭;在multiline模式,代表一行的開頭
$ : 符合整個字串的結尾;在multiline模式,代表一行的結尾
\b : 符合一個單字邊界(word boundary),一邊是\w一邊是\W
\B : 符合一個非單字邊界,兩邊都是\w 或兩邊都是\W
\A : 只符合整個字串的開頭 (不受multiline模式影響)
\Z : 只符合整個字串的結尾,或是結尾換行前 (不受multiline模式影響)
\z : 只符合整個字串的結尾 (不受multiline模式影響)
\G : 若使用preg_match有設offset時,代表offset的位置,offset為0時就與\A相同
參考
Escape sequences
如果是要表達前後是否為某個字串,但不要把這字串抓進來的話,有分為
Lookahead 看後面
(?=abc) : positive 接下來必需是
abc
(?!abc) : negative 接下來不能是
abc
Lookbehind 看前面
(?<=abc) : positive 前面是接
abc
(?<!abc) : negative 前面不是接
abc
舉例
\w+(?=;) 只會抓到後面有接
;的
\w+,但不會把
;抓進來
foo(?!bar) 會抓到所有後面不是接
bar的
foo
(?!foo)bar 錯誤用法,因為後面不可能同時是
foo又是
bar,這樣所有的
bar都會抓到
如果想要前面不是接
foo的話,要用Lookbehide的用法
(?<!foo)bar 這樣才對,會抓到所有前面不是接
foo的
bar
可以使用
(?<=bullock|
donkey)來抓前面是
bullock或
donkey的字串
但要注意lookbehind的用法時,
所有匹配的字串可以分別為不同長度,但每個必需是固定的長度
例如
(?<!dogs?|
cats?
) 就不行
要匹配不同長的字串也僅至於最上層的分支,像
(?<=abc|
abde) 可以,但
(?<=ab(
c|
de)
) 就不行
Assertions可以連續使用
例如
(?<=\d{3}
)(?<!999
)foo 可以抓到前面是3個非999數字的
foo
注意這兩個assertions都是檢查同一個位置,所以不會抓到前面接6個字元的
foo
像 123abcfoo 的foo就不會被抓到,如果要抓像這樣的foo,要用
(?<=\d{3}...
)(?<!999
)foo
Assertions可以巢狀使用
例如
(?<=(?<!foo
)bar
)baz 可以抓到 前面是 bar 且 bar 的前面不是 foo 的
baz
例如
(?<=\d{3}...
(?<!999
))foo 可以抓到 前面是 3個數字與3個非999字元 的
foo
--
--
※ 作者: Knuckles 時間: 2011-10-09 03:26:15
※ 編輯: Knuckles 時間: 2011-10-11 05:22:32