12

我一直在使用

explode(".",$mystring)

将段落拆分为句子。但是,这不包括以不同标点符号结束的句子,例如!? : ;

有没有办法使用数组作为分隔符而不是单个字符?或者是否有另一种使用各种标点符号进行拆分的巧妙方法?

我试过了

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

希望,但它没有工作......

4

8 回答 8

19

您可以preg_split()结合PCRE 前瞻条件.在每次出现, ;, :, ?, , ..后拆分字符串!,同时保持实际标点符号完整:

代码:

$subject = 'abc sdfs.    def ghi; this is an.email@addre.ss! 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 an.email@addre.ss!
    [3] => asdasdasd?
    [4] => abc xyz
)

您还可以通过插入否定的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
)
于 2012-05-08T07:21:42.157 回答
6

你可以做:

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

或(更简单):

preg_split('/[.?!]/',$mystring);
于 2012-05-08T07:13:11.713 回答
2

假设您实际上想要带有最终结果的标点符号,您是否尝试过:

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

这将使您的标点符号保持完整。

于 2012-05-08T07:14:56.260 回答
1
preg_split('/\s+|[.?!]/',$string);

一个可能的问题可能是如果有一个电子邮件地址,因为它可能会在中途将其拆分到一个新行。

于 2012-05-08T07:14:47.200 回答
0

使用preg_split并给它一个像 [\.|\?!] 这样的正则表达式来分割

于 2012-05-08T07:12:08.133 回答
0
$mylist = preg_split("/[.?!:;]/", $mystring);
于 2012-05-08T07:13:04.407 回答
0

爆炸不能有多个分隔符。这preg_split();就是为了。但即便如此,它也会在分隔符处爆炸,因此您将返回没有标点符号的句子。您可以更进一步地使用 preg_split 并将其标记为使用 PREG_SPLIT_DELIM_CAPTURE 在它们自己的元素中返回它们,然后运行一些循环来爆破句子并在返回的数组中跟随标点符号,或者只使用preg_match_all();

preg_match_all('~.*?[?.!]~s', $string, $sentences);
于 2012-05-08T07:13:56.400 回答
0

你可以试试preg_split

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

请注意,这将删除标点符号。如果您还想去掉前导或尾随空格

$sentences = preg_split("/[.?!:;]+\s+?/", $mystring);
于 2012-05-08T07:15:05.873 回答