Мне нужно разделить абзац на предложения.
Вот где я немного запутался с регулярным выражением.
Я уже говорил об этом вопрос которому этот 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?"")
Когда у меня нет кавычек в строке, разделение работает как требуется.
Любая помощь приветствуется. Спасибо.
Есть некоторые проблемы с вашим регулярным выражением, что главная из них — путаница групповых конструкций с классами символов. Труба |
в классе символов означает |
в прямом смысле. Это не имеет особого значения.
Что вам нужно, это:
("[^"]*")|[!?.]+\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?""}
Я вижу вашу проблему расщепления, основанную на определенной пунктуации, уже решенной, за исключением того, что она не работает в случае двойных кавычек. Мы можем сформулировать решение так, как если бы мы увидели такую пунктуацию, или же при просмотре этой пунктуации следует двойная кавычка.
Разделение должно произойти, когда предыдущий символ соответствует одному из ваших маркеров а также то, что следует, не является двойной кавычкой, или два предыдущих символа должны быть маркером а также двойная цитата. Это подразумевает разбиение по следующему шаблону, который использует обходные пути:
(?<=[.!?\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?" )