顯示廣告
隱藏 ✕
看板 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
※ 看板: KnucklesNote 文章推薦值: 3 目前人氣: 0 累積人氣: 2064 
( ̄︶ ̄)b tomin, Jamesz, tails 說讚!
e)編輯 d)刪除 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇