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