最終處理結果為: 好了. 不多說了. 看代碼吧 >>> [第一種]: 這裡的partent1和partent2同樣可以匹配出類似如下的數據:: 但partent1與partent2所不同的是, partent1會在最後匹配時, 多了一行\n的匹配,...如紅色箭頭所指的: 嗯, 大家應該看到是什麼原 ...
//如何把以下的字元串分成每一個小塊, 如: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的方法來說還是有一定的效率差...正則中的獲取數據應用比較多的一是用於爬蟲技術; 二是用於匹配判斷,比如是匹配手機郵箱什麼的.
不足之處還有很多, 有什麼問題希望留言讓我改進,不勝感激!