Использование splitAt в регулярном выражении reg_split для сохранения их в результирующем массиве

Есть ли способ использовать splitAt в регулярном выражении preg_split и сохранить их в результирующем массиве вместе с результатами? Например:

$text = " did the great white eat the fishes ";
$text = preg_split("~( did | eat )~", $text, -1, PREG_SPLIT_NO_EMPTY); 

print_r($text);

Результат:

Array ( [0] => the great white [1] => the fishes )

Хотите результата:

Array ( [0] => the great white [1] => eat [2] => the fishes )

3 ответа

Решение

Ты можешь использовать PREG_SPLIT_DELIM_CAPTURE флаг для захвата разделителей, используемых в результирующем массиве:

$text = " did the great white eat the fishes ";
$wrds='did|eat';

$arr = preg_split("~\h+($wrds)\h+~", preg_replace("/^\h*($wrds)\h+/", "" $text),
                  -1, PREG_SPLIT_DELIM_CAPTURE));
print_r($arr);

Или еще:

$arr = preg_split("~^\h+(?:$wrds)\h+|\h+($wrds)\h+~", $text, -1,
              PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);

Выход:

Array
(
   [0] => the great white
   [1] => eat
   [2] => the fishes
)

Если вы хотите захватить разделитель "сделал" или "есть" только тогда, когда он находится в
в середине, вам, вероятно, придется сначала проверить крайние случаи:

^(?: did | eat )|(?: did | eat )$|( did | eat ) 

с этими опциями PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY

В Perl нет аналога PREG_SPLIT_NO_EMPTY,

$text = " did the great white eat the fishes ";
$array = preg_split("~( did | eat )~", $text, -1, PREG_SPLIT_NO_EMPTY); 
preg_match("~$array[0](.+?)$array[1]~", $text, $match);

$text1 = $array[0];
$text2 = $array[1];
$text3 = $match[1];

echo $text1."<br>".$text3."<br>".$text2;

Результат:

the great white
eat 
the fishes
Другие вопросы по тегам