A. 怎麼用php正則獲得a標簽內的文字啊
php中正則匹配只要使用這兩個函數:
preg_match_all
preg_match
這里使用preg_match_all,代碼如下:
$subject='<ahref="xxx.php">abc測試</a>';//假設這是需要匹配的字元串
$pattern='/<ahref="[^"]*"[^>]*>(.*)</a>/';//這是匹配的正則表達式
preg_match_all($pattern,$subject,$matches);//開始匹配,該函數會把匹配結果放入$matches數組中
echo"<pre>";
print_r($matches);
/**
結果是:
Array
(
[0]=>Array
(
[0]=>abc測試
)
[1]=>Array
(
[0]=>abc測試
)
)
*/
B. php正則表達式
優先匹配哪個?
通常是優先匹配左邊的(從左往右執行嘛,然後又因為有貪婪性,比如[0-9]*[0-9]*去匹配123,左邊的[0-9]*會匹配到12,右邊的[0-9]*會匹配到3),正則表達式左邊的部分會匹配到能是能使匹配成功的最長的匹配,具體原因如下:
貪婪、回溯和正則導向引正則擎的急切性:正則的{}和*合+有具貪婪性會向後匹配到他們可以匹配的盡可能多的字元串。但是如果重復性的匹配會引起整個(後面的)正則表達式匹配失敗時,會引起回溯,放棄最後一次重復匹配(相當於剩餘的字元串從左邊增加了一位),用表達式後面的部分匹配剩餘的字元串。在前面的正則匹配成功後立即用剩餘的表達式部分繼續匹配後面的內容,如果匹配成功會立刻返回匹配成功,不會繼續回溯(php的正則表達式引擎室正則導向的)
。
裡面的(.*)是怎麼找得?
*有具貪婪性會向後匹配到.可以匹配的最大長度的字元串,最初匹配到-2011-2012,然後因為回溯不斷減少匹配的值,直到匹配-201。
過程是怎樣的,
執行順序:
1.[0-9]{2,4}會先匹配到2010,
2.然後(.*),因為*得貪婪性會匹配到後面所有.能匹配的字元-2011-2012。
3.此時表達式執行到[0-9]{1,2},因為[0-9]{1,2}此時沒有任何可以匹配的內容,所以引起回溯(.*)匹配到前一次匹配結果的倒數第2位重新匹配到-2011-201,[0-9]{1,2}與最後一位匹配成功得到字元串最後面的2,因為正則引擎的急切性,匹配成功後會立即用正則表達式剩餘的部分繼續向後匹配。
4.此時表達式執行到\1,字元串後面沒有剩下任何東西所以\1 (\1指(.*)匹配的結果-2011-201)匹配失敗,然後引起回溯。[0-9]{1,2}向前移一位,結果[0-9]{1,2}沒有字元可以進行匹配操作,匹配失敗。引起回溯,(.*)匹配到前一次匹配結果的倒數第2位重新匹配到-2011-20,再用[0-9]{1,2}匹配得到12,後面依然沒有字元與\1匹配,引起回溯,此次[0-9]{1,2}匹配到1,\1(此時值為-2011-20)與2匹配再次失敗。於是重復上面的回溯【此處省去n百字,總之是重復上面的回溯】,直到(.*)匹配到-201,\1匹配到了-2012中的-201,因為正則導向的正則引擎是急切的,不再進行回溯,繼續後面的匹配。
5.最後,[0-9]{1,2}與字串剩餘部(最後一個字元)2匹配成功返回,因為正則導向的正則引擎是急切的,所以立刻返回匹配結果,不再進行回溯。
睡覺前看到的沒想到寫出來這么難,不過也沒白寫,就當總結了。