2015-08-24 2 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>"; 
Смежные вопросы