7. 回調(diào)(Callbacks)
匹配結(jié)果中的特定內(nèi)容有時可能會需要某種特別的修改。要應(yīng)用多重而復(fù)雜的修改,正則表達(dá)式的回調(diào)就有了用武之地。回調(diào)是用于函數(shù)preg_replace_callback 中的動態(tài)修改字串的方式。你可以為preg_replace_callback 指定某個函數(shù)為參數(shù),此函數(shù)能接收匹配結(jié)果數(shù)組為參數(shù),并將數(shù)組修改后返回,作為替換的結(jié)果。
例如,我們想將某字串中的字母全部轉(zhuǎn)變成大寫。十分不巧,PHP沒有直接轉(zhuǎn)化字母大小寫的正則操作符。要完成這項任務(wù),就可以用到正則回調(diào)。首先,表達(dá)式要匹配出所有需要被大寫的字母:
/\b\w/
上式同時使用了字詞邊界和字符類。光有這個式子還不夠,我們還需要一個回調(diào)函數(shù):
function upper_case( $matches ) {
return strtoupper ( $matches [0] );
}
函數(shù)upper_case 接收匹配結(jié)果數(shù)組,并將整個匹配結(jié)果轉(zhuǎn)化成大寫。 在此例中,$matches[0] 代表需要被大寫化的字母。然后,我們再利用preg_replace_callback 實現(xiàn)回調(diào):
preg_replace_callback( '/\b\w/' , "upper_case" , $str );
一個簡單的回調(diào)即有這般強大的力量。
8. 注釋(Commenting)
注釋不用來匹配字串,但確實是正則表達(dá)式中最重要的部分。當(dāng)正則越寫越深入,越寫越復(fù)雜,要推譯出究竟什么東西被匹配就會變得越來越困難。在正則表達(dá)式中間加上注釋,是最小化將來的迷糊和困惑的最佳方式。
要在正則表達(dá)式內(nèi)部加上注釋,使用(?#comment) 格式。把“comment”替換成你的注釋語句:
/(?#數(shù)字)\d/
如果你打算把代碼公之于眾,為正則表達(dá)式加上注釋就顯得尤為重要。這樣別人才能更容易看懂和修改你的代碼。和其他場合的注釋一樣,這樣做也能為你重訪自己以前寫的程序時提供方便。
考慮使用“x”或“(?x)”修改器來格式化注釋。這個修改器讓正則引擎忽略表達(dá)式參數(shù)之間的空格!坝杏玫摹笨崭袢匀荒軌蛲ㄟ^[ ] 或\s ,或者\ (反義符加空格)來匹配。
/
\d #digit
[ ] #space
\w+ #word
/x
上面的代碼與下面的式子作用一樣:
/\d(?#digit)[ ](?#space)\w+(?#word)/
請時刻注意代碼的可讀性。
更多資源(英文)
關(guān)于作者
Karthik Viswanathan 是一個喜歡編程和做網(wǎng)站的高中生。你可以到他的博客上查看他的作品:Lateral Code。你也可以關(guān)注一下他的線上Twitter應(yīng)用。
譯文原文:http://blog.benhuoer.com/posts/crucial-concepts
本文鏈接:http://www.95time.cn/tech/program/2009/6757.asp
出處:笨活兒
責(zé)任編輯:bluehearts
上一頁 正則表達(dá)式高級技巧及實例詳解 [4] 下一頁
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|