//如何把如下的字符串分红每个小块, 如:2017.2.14\n咱们都是中国人\n小日本 这样的为一个小块 $str = '2017.2.14 咱们都是中国人 小日本 2017.2.15 订单取消 资讯标签bug 哈看看我给 余额充值页面 2017.2.16 修改bug 加载更多哈哈 2017.2.17 中中中中 中岛 小肥羊';
最终处理结果为: php
好了. 很少说了. 看代码吧--->>>数组
[第一种]:spa
// $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一样能够匹配出相似以下的数据::3d
但partent1与partent2所不一样的是, partent1会在最后匹配时, 多了一行\n的匹配,...如红色箭头所指的:指针
嗯, 你们应该看到是什么缘由了吧... 两个正则所不一样, partent1用的匹配方法是直接匹配到日期后面的中文而后返回, 而partent2用的匹配方法是取两个日期中间匹配的方法, 如partent1中的 [\x{4e00}-\x{9fa5}_a-zA-Z\n\r] 里面就是匹配到了\n\r 这样的. 因此每次匹配非最后一段时都会有这样的结果.... 这里还得想办法去掉它才好-----code
好了. 第一种方法的最终结果为:blog
{第一种: ---正确}字符串
[第二种]class
如今来看看第二种方法, 这种方法就比较笨一点. 但也很直观. 就是一个字符串的处理效率
直接上代码:::
$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的方法来讲仍是有必定的效率差...正则中的获取数据应用比较多的一是用于爬虫技术; 二是用于匹配判断,好比是匹配手机邮箱什么的.
不足之处还有不少, 有什么问题但愿留言让我改进,不胜感激!