regex — preg_split () с несколькими шаблонами, не разделяющими строку в кавычках

Мне нужно разделить абзац на предложения.
Вот где я немного запутался с регулярным выражением.

Я уже говорил об этом вопрос которому этот Q помечен как дубликат к. но проблема здесь другая.

Вот пример строки, которую мне нужно разделить:

Здравствуйте! как твои дела? как жизнь
живи жизнью, живи свободно. «не так ли?»

вот код, который я попробовал:

$sentence_array = preg_split('/([.!?\r\n|\r|\n])+(?![^"]*")/', $paragraph, -1);

Что мне нужно это:

array (
[0] => "hello"[1] => "how are you"[2] => "how is life"[3] => "live life, live free"[4] => ""isnt it?"")

Что я получаю это:

array(
[0] => "hello! how are you? how is life live life, live free. "isnt it?"")

Когда у меня нет кавычек в строке, разделение работает как требуется.

Любая помощь приветствуется. Спасибо.

1

Решение

Есть некоторые проблемы с вашим регулярным выражением, что главная из них — путаница групповых конструкций с классами символов. Труба | в классе символов означает | в прямом смысле. Это не имеет особого значения.

Что вам нужно, это:

("[^"]*")|[!?.]+\s*|\R+

Сначала он пытается сопоставить строку, заключенную в двойные кавычки (и захватывает содержимое). Затем пытается сопоставить любые знаки препинания от [!?.] установить разделить на них. Затем идет для любого вида символов новой строки, если найден.

PHP:

var_dump(preg_split('~("[^"]*")|[!?.]+\s*|\R+~', <<<STR
hello! how are you? how is life
live life, live free. "isnt it?"STR
, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY));

Выход:

array(5) {
[0]=>
string(5) "hello"[1]=>
string(11) "how are you"[2]=>
string(11) "how is life"[3]=>
string(20) "live life, live free"[4]=>
string(10) ""isnt it?""}
2

Другие решения

Я вижу вашу проблему расщепления, основанную на определенной пунктуации, уже решенной, за исключением того, что она не работает в случае двойных кавычек. Мы можем сформулировать решение так, как если бы мы увидели такую ​​пунктуацию, или же при просмотре этой пунктуации следует двойная кавычка.

Разделение должно произойти, когда предыдущий символ соответствует одному из ваших маркеров а также то, что следует, не является двойной кавычкой, или два предыдущих символа должны быть маркером а также двойная цитата. Это подразумевает разбиение по следующему шаблону, который использует обходные пути:

(?<=[.!?\r\n])(?=[^"])|(?<=[.!?\r\n]")(?=.)

Пример кода:

$input = "hello! how \"are\" \"you?\" how is life\nlive life, live free. \"isnt it?\"";
$sentence_array = preg_split('/(?<=[.!?\r\n])(?=[^"])|(?<=[.!?\r\n]\")(?=.)/', $input, -1);
print_r($sentence_array);

Array ( [0] => hello! [1] => how "are" "you?" [2] => how is life
[3] => live life, live free. [4] => "isnt it?" )
1

По вопросам рекламы [email protected]