Вставить параграф в предложения в PHP

Я использовал

explode(".",$mystring)

чтобы разделить абзац на предложения. Однако это не распространяется на предложения, которые были заключены с различными пунктуациями, такими как!?:;

Есть ли способ использовать массив как разделитель вместо одного символа? Альтернативно есть ли еще один опрятный способ расщепления с использованием различной пунктуации?

Я пробовал

explode(("." || "?" || "!"),$mystring)

надеюсь, но это не сработало...

Ответ 1

Вы можете сделать:

preg_split('/\.|\?|!/',$mystring);

или (проще):

preg_split('/[.?!]/',$mystring);

Ответ 2

Вы можете использовать preg_split() в сочетании с условием PCRE "lookahead", чтобы разбивать строку после каждого вхождения ., ;, :, ?, !,.. сохраняя фактическую пунктуацию без изменений:

Код:

$subject = 'abc sdfs.    def ghi; this is [email protected]! asdasdasd? abc xyz';
// split on whitespace between sentences preceded by a punctuation mark
$result = preg_split('/(?<=[.?!;:])\s+/', $subject, -1, PREG_SPLIT_NO_EMPTY);
print_r($result);

Результат:

Array
(
    [0] => abc sdfs.
    [1] => def ghi;
    [2] => this is [email protected]!
    [3] => asdasdasd?
    [4] => abc xyz
)

Вы также можете добавить черный список сокращений (Mr., Mrs., Dr.,..), которые не следует разбивать на собственные предложения, вставляя отрицательное утверждение "lookbehind":

$subject = 'abc sdfs.   Dr. Foo said he is not a sentence; asdasdasd? abc xyz';
// split on whitespace between sentences preceded by a punctuation mark
$result = preg_split('/(?<!Mr.|Mrs.|Dr.)(?<=[.?!;:])\s+/', $subject, -1, PREG_SPLIT_NO_EMPTY);
print_r($result);

Результат:

Array
(
    [0] => abc sdfs.
    [1] => Dr. Foo said he is not a sentence;
    [2] => asdasdasd?
    [3] => abc xyz
)

Ответ 3

Предполагая, что вы действительно хотите, чтобы метки пунктуации с конечным результатом, вы пробовали:

 $mystring = str_replace("?","?---",str_replace(".",".---",str_replace("!","!---",$mystring)));
 $tmp = explode("---",$mystring);

Который оставил бы ваши знаки препинания в такте.

Ответ 4

preg_split('/\s+|[.?!]/',$string);

Возможной проблемой может быть, если есть адрес электронной почты, так как он может разбить его на новую строку на полпути.

Ответ 5

Используйте preg_split и дайте ему регулярное выражение, например [\. | \?!], чтобы разделить на

Ответ 6

$mylist = preg_split("/[.?!:;]/", $mystring);

Ответ 7

У вас не может быть нескольких разделителей для взрыва. Это для preg_split();. Но даже тогда он взрывается в разделителе, поэтому вы получите предложения, возвращенные без знаков препинания. Вы можете сделать preg_split шаг дальше и пометить его, чтобы вернуть их в своих собственных элементах с помощью PREG_SPLIT_DELIM_CAPTURE, а затем запустить некоторый цикл для вложения предложения и после метки пунктуации в возвращаемом массиве или просто использовать preg_match_all();:

preg_match_all('~.*?[?.!]~s', $string, $sentences);

Ответ 8

Вы можете попробовать preg_split

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

Обратите внимание, это удалит знаки препинания. Если вы также хотите убрать начальные или конечные пробелы

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