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

1

Есть ли способ использовать 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

3 ответа

1
Лучший ответ

Вы можете использовать флаг 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
)
  • 0
    Но я не хочу, чтобы он хранил splitAt с пустым индексом, а «did» возвратил пустой индекс. Итак, я хочу, чтобы результат был только Array ([0] => the great white [1] => eat [2] => the fish)
  • 0
    Потому что я хочу захватить только разделитель, который на самом деле вызвал раскол, и только слово «есть» вызвало раскол между словами «большой белый» и «рыбы». Слово «сделал» не вызывало раскола между любыми словами.
Показать ещё 8 комментариев
0
$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
  • 1
    Вы предполагаете, что каждая строка будет разделена пополам. Не очень хорошее предположение.
0

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

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

с этими параметрами PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY

В Perl нет сопоставимого PREG_SPLIT_NO_EMPTY.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню