将文本拆分为句子

时间:2013-05-04 18:11:59

标签: php regex string preg-split

如何将文本拆分成句子数组?

示例文字:

  

给我一个海狸。给我一个海狸!给我一个海狸?   炸我海狸没有。 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

1 个答案:

答案 0 :(得分:26)

既然你想“分裂”句子,你为什么试图匹配它们呢?

对于这种情况,我们使用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. (?&lt; = [。?!])断言背后的正面看法,基本上我们搜索空格后面是否有点或问号或感叹号。

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