preg_match_all 结果排序之PREG_SET_ORDER参数

前端之家收集整理的这篇文章主要介绍了preg_match_all 结果排序之PREG_SET_ORDER参数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

转载自:http://www.caiguai.net/thread-21-1-1.html

今天在写通用采集类的时候,需要用到正则处理一些匹配,比较常用的当然就是preg_match_all了,以前也经常使用它来进行正则的匹配。刚在查看preg_match_all的手册的时候,注意到原来preg_match_all有一个PREG_SET_ORDER的参数,是用于设置匹配后返回的数组的顺序。

  1. 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的区别。

  1. <?PHP

  2. $str = '<a href="http://www.baidu.com/">百度</a><a href="http://www.google.com/">谷歌</a><a href="http://www.caiguai.net/">怪手论坛</a>';
  3. preg_match_all('|<a href="(.*?)">(.*?)</a>|',$str,$matches_pattern,PREG_PATTERN_ORDER);
  4. print_r($matches_pattern);
  5. print_r($matches_set);
$matches_pattern 返回的数据为:

  1. Array
  2. (
  3. [0] => Array
  4. (
  5. [0] => <a href="http://www.baidu.com/">百度</a>
  6. [1] => <a href="http://www.google.com/">谷歌</a>
  7. [2] => <a href="http://www.caiguai.net/">怪手论坛</a>
  8. )
  9. [1] => Array
  10. [0] => http://www.baidu.com/
  11. [1] => http://www.google.com/
  12. [2] => http://www.caiguai.net/
  13. [2] => Array
  14. [0] => 百度
  15. [1] => 谷歌
  16. [2] => 怪手论坛
  17. )
$matches_set 返回的数据为:

  1. [1] => http://www.baidu.com/
  2. [2] => 百度
  3. [0] => <a href="http://www.google.com/">谷歌</a>
  4. [2] => 谷歌
  5. [0] => <a href="http://www.caiguai.net/">怪手论坛</a>
  6. [1] => http://www.caiguai.net/
  7. 而根据我之前阅读别人代码,就一直认为应该这么来组合结果:

    1. foreach ($matches_pattern[0] as $tid=>$val) {
    2. echo '链接:'.$matches_pattern[1][$tid];
    3. echo '网址:'.$matches_pattern[2][$tid];
    4. echo "\r\n";
    5. }
    6. /**
    7. *返回结果为:
    8. *
    9. 链接:http://www.baidu.com/网址:百度
    10. 链接:http://www.google.com/网址:谷歌
    11. 链接:http://www.caiguai.net/网址:怪手论坛
    12. */
    而PREG_SET_ORDER,就在于重新组合的数据,使得数组数据可以更方便的利用:


    1. foreach ($matches_set as $v) {
    2. echo '链接:'.$v[1];
    3. echo '网址:'.$v[2];
    4. */
    5. 通过阅读一些优秀的源代码,可以汲取到很多先进的思想和接触一些函数方法的独特用法,但是由于初印象很重要,如果开始的时候接触到的是一些不全或者不足的代码,久而久之你用习惯以后,就很难发现它存在的问题,甚至认为这就应该是这样。当初我也自问过,为什么preg_match_all的匹配结果不能按照上面第二种方式组合呢?甚至我还曾写过一个函数来重新组合这个结果为第二种数据结果。PHP手册很重要,它是PHP的官方支持文档、是一个标准,看来以后要多阅读才行。谨以此为戒!

猜你在找的正则表达式相关文章