今天在寫通用採集類的時候,需要用到正則處理一些匹配,比較常用的當然就是preg_match_all了,以前也經常使用它來進行正則的匹配。剛在查看preg_match_all的手冊的時候,注意到原來preg_match_all有一個PREG_SET_ORDER的參數,是用於設置匹配後返回的數組的順序。
int preg_match_all ( string pattern, string subject, array matches [, int flags] )
參數flags爲以下3個:PREG_PATTERN_ORDER PREG_SET_ORDER PREG_OFFSET_CAPTURE 其中PREG_PATTERN_ORDER爲默認參數。
我們用例子來看看PREG_PATTERN_ORDER和PREG_SET_ORDER的區別。
<?php
$str = '<a href="http://www.baidu.com/">百度</a><a href="http://www.google.com/">谷歌</a><a href="http://www.caiguai.net/">怪手論壇</a>';
preg_match_all('|<a href="(.*?)">(.*?)</a>|', $str, $matches_pattern, PREG_PATTERN_ORDER);
preg_match_all('|<a href="(.*?)">(.*?)</a>|', $str, $matches_set, PREG_SET_ORDER);
print_r($matches_pattern);
print_r($matches_set);
$matches_pattern 返回的數據爲:
Array
(
[0] => Array
(
[0] => <a href="http://www.baidu.com/">百度</a>
[1] => <a href="http://www.google.com/">谷歌</a>
[2] => <a href="http://www.caiguai.net/">怪手論壇</a>
)
[1] => Array
(
[0] => http://www.baidu.com/
[1] => http://www.google.com/
[2] => http://www.caiguai.net/
)
[2] => Array
(
[0] => 百度
[1] => 谷歌
[2] => 怪手論壇
)
)
$matches_set 返回的數據爲:
Array
(
[0] => Array
(
[0] => <a href="http://www.baidu.com/">百度</a>
[1] => http://www.baidu.com/
[2] => 百度
)
[1] => Array
(
[0] => <a href="http://www.google.com/">谷歌</a>
[1] => http://www.google.com/
[2] => 谷歌
)
[2] => Array
(
[0] => <a href="http://www.caiguai.net/">怪手論壇</a>
[1] => http://www.caiguai.net/
[2] => 怪手論壇
)
)
而根據我之前閱讀別人代碼,就一直認爲應該這麼來組合結果:
foreach ($matches_pattern[0] as $tid=>$val) {
echo '鏈接:'.$matches_pattern[1][$tid];
echo '網址:'.$matches_pattern[2][$tid];
echo "\r\n";
}
/**
* 返回結果爲:
*
鏈接:http://www.baidu.com/網址:百度
鏈接:http://www.google.com/網址:谷歌
鏈接:http://www.caiguai.net/網址:怪手論壇
*/
而PREG_SET_ORDER,就在於重新組合的數據,使得數組數據可以更方便的利用:
foreach ($matches_set as $v) {
echo '鏈接:'.$v[1];
echo '網址:'.$v[2];
echo "\r\n";
}
/**
* 返回結果爲:
*
鏈接:http://www.baidu.com/網址:百度
鏈接:http://www.google.com/網址:谷歌
鏈接:http://www.caiguai.net/網址:怪手論壇
*/
通過閱讀一些優秀的源代碼,可以汲取到很多先進的思想和接觸一些函數和方法的獨特用法,但是由於初印象很重要,如果開始的時候接觸到的是一些不全或者不足的代碼,久而久之你用習慣以後,就很難發現它存在的問題,甚至認爲這就應該是這樣。當初我也自問過,爲什麼preg_match_all的匹配結果不能按照上面第二種方式組合呢?甚至我還曾寫過一個函數來重新組合這個結果爲第二種數據結果。php手冊很重要,它是php的官方支持文檔、是一個標準,看來以後要多閱讀才行。謹以此爲戒!