Как включить разделитель в результаты для preg_split()?
У меня есть этот простой шаблон, который разбивает текст на периоды:
$text = preg_split("/[\.:!\?]+/", $text);
Но я хочу включить . :
. :
или !
в конце элементов массива.
То есть теперь для "хорошо: новости. Все!" Я имею:
array("good", "news", "everyone", "");
Но я хочу:
array("good:", "news.", "everyone!", "");
Ответы
Ответ 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.