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的方法来说还是有一定的效率差...正则中的获取数据应用比较多的一是用于爬虫技术; 二是用于匹配判断,比如是匹配手机邮箱什么的.

不足之处还有很多, 有什么问题希望留言让我改进,不胜感激!

 

posted @ 2017-05-16 10:56  Wherein  阅读(1512)  评论(0编辑  收藏  举报