php 对字符串的分块处理
//如何把以下的字符串分成每一个小块, 如:2017.2.14\n我们都是中国人\n小日本 这样的为一个小块 $str = '2017.2.14 我们都是中国人 小日本 2017.2.15 订单取消 资讯标签bug 哈看看我给 余额充值页面 2017.2.16 修改bug 加载更多哈哈 2017.2.17 中中中中 中岛 小肥羊';
最终处理结果为:
好了. 不多说了. 看代码吧--->>>
[第一种]:
// $partent1 = "/(\d{4}.\d{1,2}.\d{1,2}[\n\r]+[\x{4e00}-\x{9fa5}_a-zA-Z\n\r]+)/u"; $partent2 = "/\d{4}.\d{1,2}.\d{1,2}(\S|\s[^(\d{4}.\d{1,2}.\d{1,2})])*/u"; preg_match_all($partent2, $str, $match); foreach ($match[0] as $key => $value) { $match_tmp[] = explode("\n", $value); } p($match[0], $match_tmp, 'y');
这里的partent1和partent2同样可以匹配出类似如下的数据::
但partent1与partent2所不同的是, partent1会在最后匹配时, 多了一行\n的匹配,...如红色箭头所指的:
嗯, 大家应该看到是什么原因了吧... 两个正则所不同, partent1用的匹配方法是直接匹配到日期后面的中文然后返回, 而partent2用的匹配方法是取两个日期中间匹配的方法, 如partent1中的 [\x{4e00}-\x{9fa5}_a-zA-Z\n\r] 里面就是匹配到了\n\r 这样的. 所以每次匹配非最后一段时都会有这样的结果.... 这里还得想办法去掉它才好-----
好了. 第一种方法的最终结果为:
{第一种: ---正确}
[第二种]
现在来看看第二种方法, 这种方法就比较笨一点. 但也很直观. 就是一个字符串的处理
直接上代码:::
$arr = explode("\n", $str); $tmp = [];
//这里取出带有2017字样的. 这里还可以改为带有2017.2.14日期字样的key和value foreach ($arr as $key => $value) { if (strstr($value, '2017')) { $tmp[$key][] = $value; $keyss[] = $key;//[0,3,8,11] } }
//然后处理 -- 逻辑: 遍历keyss, 当指针的下一个值存在时.
//并且符合条件$arr中的$kk介于$keyss value值的中间时, 才把$arr的value值取出, 放到相应的$tmp数组中;
//但如果指针的下一个值不存在时, 即为数组的最后一个值, 那么这里就只要满足一个条件$v<$kk就可以了 foreach ($arr as $kk => $vv) { foreach ($keyss as $k => $v) { if (isset($keyss[$k+1])) { if ($v < $kk && $kk < $keyss[$k+1]) { $tmp[$v][] = $vv; } } else { if ($v < $kk) { $tmp[$v][] = $vv; } } } } p($tmp, $keyss, $arr);
然后打印结果看看:
{第二种: ---正确}
{注: 里面的p()方法是自己写的一个数据输出方法,就一个var_dump, 大家不用在意}
总结: 摒除一点效率而言, 最简单的方法往往是最有方便快捷的. 上述的两种方法各有长短, 第一种方法里的partent1 有待改善, 第二种方法循环的太多. 但各人有各人的方法. 但一般能不用正则的就尽量不用. 正则相比php的方法来说还是有一定的效率差...正则中的获取数据应用比较多的一是用于爬虫技术; 二是用于匹配判断,比如是匹配手机邮箱什么的.
不足之处还有很多, 有什么问题希望留言让我改进,不胜感激!