Есть ли способ использовать splitAt в regex 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 )
Вы можете использовать флаг 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
)
$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
Если вы хотите захватить разделитель "did" или "eat" только тогда, когда он находится в
в середине, вам, вероятно, придется сначала проверить краевые случаи:
^(?: did | eat )|(?: did | eat )$|( did | eat )
с этими параметрами PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY
В Perl нет сопоставимого PREG_SPLIT_NO_EMPTY
.