看板 Knuckles_note
作者 Knuckles (站長 那克斯)
標題 [PHP] Regular Expression 小括弧() 的用法
時間 2011年06月16日 Thu. AM 04:47:35
PHP官方網站對於 regular expression 的小括號 () 用法的說明頁
PHP: PCRE regex syntax / Subpatterns
終於看懂了,來記錄一下...
小括弧有兩種用途:
1. 群組各種可能的子字串,例如 /
filename\.(jpg|png|gif)/
這樣就可以找到這三種副檔名的圖檔
2. 標記要取得的字串,例如 /
a=(.*?)&b=(.*?)&c=(.*?)&d=/
就可以把 a, b, c 的值分別存到 $1, $2, $3
這兩種用途有時候會混在一起,像是
echo preg_replace("/
((red|white) (king|queen))/","
$1,
$2,
$3","
red queen");
← red queen
→ $1
← red
→ $2
← queen
→ $3
會得到
red queen,
red,
queen
如果只想拿()當群組用,但不要被算進要抓的字串,可以在(後加上 ?:,例如
echo preg_replace("
/((?:red|white) (king|queen))/","
$1,
$2","
red queen");
會得到
red queen,
queen (第二個括弧的red不會被抓出來了)
?:中間可以加上選項,例如 i 是忽略大小寫
寫成
(?i:saturday|sunday) 等同於
(?:(?i)saturday|sunday)
可以符合
SUNDAY 或
Saturday,i的效果僅限於這個()
抓到的字串,除了自動依順序配給 $數字 外,也可以自己加上名字
語法 (?P<name>pattern) ,在 PHP5.2.2 另外提供了 (?<name>pattern) 及 (?'name'pattern) 兩種用法
在當群組用時,若每個可能的字串又有用到標記要抓的字串時
例如
(?:(Sat)ur|(Sun))day
用在
Sunday 時,$1="",$2="Sun"
用在
Saturday 時,$1="Sat,$2不存在
此時可以改用
(?|(Sat)ur|(Sun))day
這樣就只會抓到1個字串,$1="Sun" 或 $1="Sat"
至於(?= )、(?! )、(?<= )、(?<! ) 是 assertions 的用法,請參考
這一篇
(?> ) 是
Once-only subpatterns 又叫 Atomic Group
代表裡面的東西只要一匹配成功就不會再回溯嘗試其他的可能
--
--
※ 作者: Knuckles 時間: 2011-06-16 04:47:35
※ 編輯: Knuckles 時間: 2011-10-11 05:30:03