在PHP中将段落分解为句子

时间:2012-05-08 07:09:17

标签: php string explode text-segmentation

我一直在使用

explode(".",$mystring)

将一个段落分成句子。然而,这并不包括以不同的标点符号结束的句子,例如! ? :;

有没有办法使用数组作为分隔符而不是单个字符?另外还有另一种利用各种标点符号分割的巧妙方法吗?

我试过

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

希望但它不起作用......

8 个答案:

答案 0 :(得分:11)

.;:?每次出现后,您都可以使用preg_split()PCRE lookahead condition相结合来分割字符串,!,..同时保持实际的标点符号完整:

代码:

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

答案 1 :(得分:6)

你可以这样做:

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

或(更简单):

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

答案 2 :(得分:2)

假设您确实希望标点符号带有最终结果,您是否尝试过:

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

哪会留下你的标点符号。

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

使用preg_split并为其提供一个像[\。| \?!]这样的正则表达式来分割

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

您可以尝试preg_split

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

请注意这将删除标点符号。如果你想删除前导或尾随空格

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