Вопрос по string, php – Разбить абзац на предложения в PHP

10

Я использую

<code>explode(".",$mystring)
</code>

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

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

Я старался

<code>explode(("." || "?" || "!"),$mystring)
</code>

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

Взгляни наstackoverflow.com/questions/5032210/… Boby
используйте регулярное выражение для сопоставления с шаблоном и сохраните значение в переменной, передайте эту переменную в качестве параметра для взрыва sree

Ваш Ответ

8   ответов
6

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

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

или (проще):

preg_split('/[.?!]/',$mystring);
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
0

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

0
$mylist = preg_split("/[\.|\?!:;]/", $mystring);
1
preg_split('/\s+|[.?!]/',$string);

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

2

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

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

Что оставит ваши знаки препинания в такте.

0

preg_split

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

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

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

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

Код:

$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
)
0

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

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

Похожие вопросы