//如何把如下的字符串分紅每個小塊, 如: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的方法來講仍是有必定的效率差...正則中的獲取數據應用比較多的一是用於爬蟲技術; 二是用於匹配判斷,好比是匹配手機郵箱什麼的.
不足之處還有不少, 有什麼問題但願留言讓我改進,不勝感激!