php - preg_split () с несколькими шаблонами, не разделяющими строку в кавычках - PullRequest
0 голосов
/ 28 сентября 2018

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

Я уже упоминал этот вопрос , которому этот 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?""
)

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

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

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Существуют некоторые проблемы с вашим регулярным выражением, из-за которых основная из них - путаница групповых конструкций с классами символов.Канал | в классе символов означает буквально |.У него нет особого значения.

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

("[^"]*")|[!?.]+\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?""
}
0 голосов
/ 28 сентября 2018

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

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

(?<=[.!?\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?" )
...