Подтвердить что ты не робот

Как включить разделитель в результаты для preg_split()?

У меня есть этот простой шаблон, который разбивает текст на периоды:

$text = preg_split("/[\.:!\?]+/", $text);

Но я хочу включить . : . : или ! в конце элементов массива.

То есть теперь для "хорошо: новости. Все!" Я имею:

array("good", "news", "everyone", "");

Но я хочу:

array("good:", "news.", "everyone!", "");
4b9b3361

Ответ 1

Здесь вы идете:

preg_split('/([^.:!?]+[.:!?]+)/', 'good:news.everyone!', -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

Как это работает: шаблон фактически превращает все в разделитель. Затем, чтобы включить эти разделители в массив, вы можете использовать константу PREG_SPLIT_DELIM_CAPTURE. Это вернет массив вроде:

array (
    0 => '',
    1 => 'good:',
    2 => '',
    3 => 'news.',
    4 => '',
    5 => 'everyone!',
    6 => '',
);

Чтобы избавиться от пустых значений, используйте PREG_SPLIT_NO_EMPTY. Чтобы объединить две или более из этих констант, мы используем побитовый оператор |. Результат:

array (
    0 => 'good:',
    1 => 'news.',
    2 => 'everyone!'
);

Ответ 2

PREG_SPLIT_DELIM_CAPTURE для PREG_SPLIT_DELIM_CAPTURE если вы используете положительный взгляд в своем шаблоне. Функция сохранит разделители.

$text = preg_split('/(?<=[.:!?])/', 'good:news.everyone!', 0, PREG_SPLIT_NO_EMPTY);

Если вы используете lookbehind, он будет просто искать символ, не сопоставляя его. Так, в случае preg_split(), функция не будет сбрасывать символ.

Результат без флага PREG_SPLIT_NO_EMPTY:

array (
    0 => 'good:',
    1 => 'news.',
    2 => 'everyone!',
    3 => ''
);

Результат с флагом PREG_SPLIT_NO_EMPTY:

array (
    0 => 'good:',
    1 => 'news.',
    2 => 'everyone!'
);

Вы можете проверить это с помощью PHP Online Function Tester.