php 對字符串的分塊處理

//如何把如下的字符串分紅每個小塊, 如: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的方法來講仍是有必定的效率差...正則中的獲取數據應用比較多的一是用於爬蟲技術; 二是用於匹配判斷,好比是匹配手機郵箱什麼的.

不足之處還有不少, 有什麼問題但願留言讓我改進,不勝感激!

相關文章
相關標籤/搜索