2. 回返引用(Back referencing)
有什么用?
回返引用(Back referencing)一般被翻譯成“反向引用”、“后向引用”、“向后引用”,個人覺得“回返引用”更為貼切[笨活兒]。它是在正則表達式內部引用之前捕獲到的內容的方法。例如,下面這個簡單例子的目的是匹配出引號內部的內容:
# 建立匹配數(shù)組 $matches = array(); # 建立字串 $str = "\"This is a 'string'\""; # 用正則表達式捕捉內容 preg_match( "/(\"|').*?(\"|')/", $str, $matches ); # 輸出整個匹配字串 echo $matches[0];
它會輸出:
"This is a'
顯然,這并不是我們想要的內容。 這個表達式從開頭的雙引號開始匹配,遭遇單引號之后就錯誤地結束了匹配。這是因為表達式里說:("|'),也就是雙引號(")和單引號(')均可。要修正這個問題,你可以用到回返引用。表達式\1,\2,…,\9 是對前面已捕獲到的各個子內容的編組序號,能作為對這些編組的“指針”而被引用。在此例中,第一個被匹配的引號就由1代表。
如何運用?
將上面的例子中,后面的閉合引號替換為1:
preg_match( '/("|\').*?\1/', $str, $matches );
這會正確地返回字串:
"This is a 'string'"
譯注思考題: 如果是中文引號,前引號和后引號不是同一個字符,怎么辦? 還記得PHP函數(shù) preg_replace 嗎?其中也有回返引用。只不過我們沒有用 \1 … \9,而是用了 $1 … $9 … $n (此處任意數(shù)目均可)作為回返指針。例如,如果你想把所有的段落標簽都替換成文本:
$text = preg_replace( '/<p>(.*?)< \/p>/', '<p>$1</p>', $html );
參數(shù)$1是一個回返引用,代表段落標簽內部的文字,并插入到替換后的文本里。這種簡便易用的表達式寫法為我們提供了一個獲取已匹配文字的簡單方法,甚至在替換文本時也能使用。
出處:笨活兒
責任編輯:bluehearts
上一頁 貪婪/懶惰 下一頁 已命名捕獲組(Named Groups)
◎進入論壇網(wǎng)頁制作、WEB標準化版塊參加討論,我還想發(fā)表評論。
|