10

如何将文本拆分为一组句子?

示例文本:

给我炒一只海狸。炒我一只海狸!给我炒海狸?炒我海狸没有。4?!给我煎很多海狸...结束

应该输出:

0 => Fry me a Beaver.
1 => Fry me a Beaver!
2 => Fry me a Beaver?
3 => Fry me Beaver no. 4?!
4 => Fry me many Beavers...
5 => End

我尝试了一些通过搜索在 SO 上找到的解决方案,但它们都失败了,尤其是在第 4 句。

/(?<=[!?.])./

/\.|\?|!/

/((?<=[a-z0-9)][.?!])|(?<=[a-z0-9][.?!]\"))(\s|\r\n)(?=\"?[A-Z])/

/(?<=[.!?]|[.!?][\'"])\s+/    // <- closest one
4

1 回答 1

28

既然您想“拆分”句子,为什么要尝试匹配它们?

对于这种情况,让我们使用preg_split()

代码:

$str = 'Fry me a Beaver. Fry me a Beaver! Fry me a Beaver? Fry me Beaver no. 4?! Fry me many Beavers... End';
$sentences = preg_split('/(?<=[.?!])\s+(?=[a-z])/i', $str);
print_r($sentences);

输出:

Array
(
    [0] => Fry me a Beaver.
    [1] => Fry me a Beaver!
    [2] => Fry me a Beaver?
    [3] => Fry me Beaver no. 4?!
    [4] => Fry me many Beavers...
    [5] => End
)

解释:

简单地说,我们按分组空间\s+进行分割,并做两件事:

  1. (?<=[.?!])肯定看断言后面,基本上我们搜索空格后面是否有点或问号或感叹号。

  2. (?=[az])正向前瞻断言,搜索空格后是否有字母,这是解决问题的一种解决方法no. 4

于 2013-05-04T18:47:33.127 回答