2015-08-24 84 views
1

我讀過其他相關的帖子,但不可能使它適用於我的情況。使用preg_split但保留分隔符

我有以下文字:

This. Is a test. I show. You. 

我想使用使preg_split使用分隔符」。 '(點+空格),但我需要在返回的數組中保留分隔符。下面是需要的結果:

array(
    '0' => 'This.', 
    '1' => 'Is a test.', 
    '2' => 'I show.', 
    '3' => 'You.', 
); 

我已經嘗試過:

preg_split("/(\.\s/)", $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); 

回答

4

使用零寬度斷言(這裏回顧後):

$result = preg_split('~(?<=\.)\s~', $text, -1, PREG_SPLIT_NO_EMPTY); 

,或者您可以使用\K功能,刪除所有從整個左比賽:

$result = preg_split('~\.\K\s~', $text, -1, PREG_SPLIT_NO_EMPTY); 

沒有正則表達式(如果空格只能是空格,如果最後一個點是不是後面有一個空格):

$chunks = explode('. ', $text); 
$last = array_pop($chunks); 
$result = array_map(function ($i) { return $i . '.'; }, $chunks); 
$result[] = $last; 

或更好:

$result = explode(' #&§', strtr($text, ['. '=>'. #&§'])); 
+0

關閉,但OP要保持分隔符 - 點+空間,在那裏發現... – sinisake

+0

@nevermind:仔細查看想要的結果,你會看到空間不在這裏。 –

+0

是的,你是對的,但這使我困惑:但我需要保持返回數組中的分隔符?如果空間不需要,太棒了。 :) +1,無論如何... – sinisake

0

試試這個

$matches = preg_split("/ (?=.)/", $text); 
var_dump($matches); 
0

這是不是正則表達式的解決方案,但另一種變體。也許這會爲你工作太:

$text = "This. Is a test. I show. You."; 

$result = explode('DELIM', str_replace('. ', '.DELIM', $text)); 
0

使用preg_split()和更多的東西

$text="This. Is a test. I show. You."; 
$myVec=preg_split("/(\.\040)/", $text,-1,PREG_SPLIT_DELIM_CAPTURE); 
$j=0; 
for ($i = 0; $i < count($myVec); $i++) { 
    if ($myVec[$i]!=". ") { 
     $myNewVec[$j]=$myVec[$i]; 
    }else{ 
     $myNewVec[$j-1]=$myNewVec[$j-1].$myVec[$i]; 
    } 
$j++; 
} 
echo"<pre>"; 
var_dump($myNewVec); 
echo "</pre>"; 
相關問題