preg_match_all 結果排序之PREG_SET_ORDER參數

今天在寫通用採集類的時候,需要用到正則處理一些匹配,比較常用的當然就是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的官方支持文檔、是一個標準,看來以後要多閱讀才行。謹以此爲戒!

首發於:http://www.caiguai.net/thread-21-1-1.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章