preg_match_all 结果排序之PREG_SET_ORDER参数
2017-07-05 14:58
344 查看
转载自:http://www.caiguai.net/thread-21-1-1.html
今天在写通用采集类的时候,需要用到正则处理一些匹配,比较常用的当然就是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的官方支持文档、是一个标准,看来以后要多阅读才行。谨以此为戒!
今天在写通用采集类的时候,需要用到正则处理一些匹配,比较常用的当然就是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的官方支持文档、是一个标准,看来以后要多阅读才行。谨以此为戒!
相关文章推荐
- preg_match_all 结果排序之PREG_SET_ORDER参数
- preg_match_all中第四个参数PREG_PATTERN_ORDER,PREG_SET_ORDER,PREG_OFFSET_CAPTURE之间的区别!
- preg_match_all中第四个参数PREG_PATTERN_ORDER,PREG_SET_OR
- preg_match_all中第四个参数PREG_PATTERN_ORDER,PREG_SET_ORDER,PREG_OFFSET_CAPTURE之间的区别
- preg_match_all中的标记
- preg_match、preg_match_all使用注意点
- preg_match_all 获取图片地址的方法
- php_match/preg_match_all 默认有字符串长度限制
- PHP 正则表达式匹配函数 preg_match 与 preg_match_all
- 正则匹配 preg_match与preg_match_all 函数
- 基于preg_match_all采集后数据处理的一点心得笔记(编码转换和正则匹配)
- php preg_match 和preg_match_all
- db2set DB2INSTPROF创建实例导致实例启动出现1042错误,db2set -all无结果
- php 正则获取字符串中的汉字preg_match_all
- PHP 的 preg_match 和 preg_match_all
- preg_match_all使用心得分享
- preg_match_all
- PHP 正则表达式之正则处理函数小结(preg_match,preg_match_all,preg_replace,preg_split)
- 如何运用PHP函数preg_match_all测试正则表达式效果
- PHP 正则表达式匹配函数 preg_match 与 preg_match_all