PHP 板


LINE

看板 PHP  RSS
PHP官網寫的好難懂,所以來整理一下自己的心得版 PHP官方網站對於 regular expression 的小括號 () 用法的說明頁 http://www.php.net/manual/en/regexp.reference.subpatterns.php 我自己寫的一點筆記: (網頁上色版 http://disp.cc/b/11.cj-1SO9 ) 小括弧有兩種用途: 1. 群組各種可能的子字串,例如 /filename\.(jpg|png|gif)/ 這樣就可以找到這三種副檔名的圖檔 2. 標記要取得的字串,例如 /a=(.*?)&b=(.*?)&c=(.*?)&d=/ 就可以把 a, b, c 的值分別存到 $1, $2, $3 這兩種用途有時候會混在一起,像是 preg_replace("/((red|white) (king|queen))/","$1, $2, $3","red queen"); ← red queen → $1 ← red → $2 ← queen → $3 會得到 red queen, red, queen 如果只想拿()當群組用,但不要被算進要抓的字串,可以在(後加上 ?:,例如 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 的用法 PHP官方網站對於 assertions 的說明 http://www.php.net/manual/en/regexp.reference.assertions.php 我寫的一點筆記: (網頁上色版:http://disp.cc/b/11.cj-2pRT ) 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相同 如果是要表達前後是否為某個字串,但不要把這字串抓進來的話,有分為 Lookahead 看後面 (?=abc) : 接下來必需是abc (?!abc) : 接下來不能是abc Lookbehind 看前面 (?<=abc) : 前面是接abc (?<!abc) : 前面不是接abc 舉例 \w+(?=;) 只會抓到後面有接;的\w+,但不會把;抓進來 foo(?!bar) 會抓到所有後面不是接bar的foo (?!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 --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 111.248.11.75
1F:推 shadowjohn:謝大大無私的分享心得 10/10 02:17
2F:推 JeffMcBride:我覺得這篇很「讚!」 10/10 11:12
3F:推 davidou:這篇超好的阿 未看先推 10/10 12:19
4F:推 tyf99:棒,regex 和 flex 都是不容易上手,但非常好用的東西.. 10/10 15:06
5F:推 etetet91:好文推! 10/10 21:57
6F:推 Leet:好文推推 10/11 00:41
7F:推 maplenote:好文推!! 10/11 17:03
8F:推 chrisQQ:讚 10/11 21:08
9F:推 bibo9901:很實用, 推! 10/11 22:19







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:WOW站內搜尋

TOP