Использование 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