如何将文本拆分成句子数组?
示例文字:
给我一个海狸。给我一个海狸!给我一个海狸? 炸我海狸没有。 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
答案 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 + 拆分并做两件事:
(?&lt; = [。?!])断言背后的正面看法,基本上我们搜索空格后面是否有点或问号或感叹号。
(?= [az])正向前看断言,搜索空格后面是否有字母,这是no. 4
问题的解决方法。