Ответ 1
Вы можете сделать:
preg_split('/\.|\?|!/',$mystring);
или (проще):
preg_split('/[.?!]/',$mystring);
Я использовал
explode(".",$mystring)
чтобы разделить абзац на предложения. Однако это не распространяется на предложения, которые были заключены с различными пунктуациями, такими как!?:;
Есть ли способ использовать массив как разделитель вместо одного символа? Альтернативно есть ли еще один опрятный способ расщепления с использованием различной пунктуации?
Я пробовал
explode(("." || "?" || "!"),$mystring)
надеюсь, но это не сработало...
Вы можете сделать:
preg_split('/\.|\?|!/',$mystring);
или (проще):
preg_split('/[.?!]/',$mystring);
Вы можете использовать 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
)
Предполагая, что вы действительно хотите, чтобы метки пунктуации с конечным результатом, вы пробовали:
$mystring = str_replace("?","?---",str_replace(".",".---",str_replace("!","!---",$mystring)));
$tmp = explode("---",$mystring);
Который оставил бы ваши знаки препинания в такте.
preg_split('/\s+|[.?!]/',$string);
Возможной проблемой может быть, если есть адрес электронной почты, так как он может разбить его на новую строку на полпути.
Используйте preg_split и дайте ему регулярное выражение, например [\. | \?!], чтобы разделить на
$mylist = preg_split("/[.?!:;]/", $mystring);
У вас не может быть нескольких разделителей для взрыва. Это для preg_split();
. Но даже тогда он взрывается в разделителе, поэтому вы получите предложения, возвращенные без знаков препинания.
Вы можете сделать preg_split шаг дальше и пометить его, чтобы вернуть их в своих собственных элементах с помощью PREG_SPLIT_DELIM_CAPTURE, а затем запустить некоторый цикл для вложения предложения и после метки пунктуации в возвращаемом массиве или просто использовать preg_match_all();
:
preg_match_all('~.*?[?.!]~s', $string, $sentences);
Вы можете попробовать preg_split
$sentences = preg_split("/[.?!:;]+/", $mystring);
Обратите внимание, это удалит знаки препинания. Если вы также хотите убрать начальные или конечные пробелы
$sentences = preg_split("/[.?!:;]+\s+?/", $mystring);