php - 将文本拆分成句子

标签 php regex string preg-split

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

示例文本:

Fry me a Beaver. Fry me a Beaver! Fry me a Beaver? Fry me Beaver no. 4?! Fry me many Beavers... End

应该输出:

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

最佳答案

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

对于这种情况,让我们使用 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. (?=[a-z]) 正向前瞻断言,搜索空格后是否有字母,这是 no 的一种变通方法。 4问题。

关于php - 将文本拆分成句子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16377437/

相关文章:

regex - 正则表达式匹配 12345

java - HashMap.put() 覆盖已经存在的值,即使 Key 值不同

c - GetWindowText 时替换字符\uFFFD(C 代码)

vb.net - 读取控制台进程输出

python - 如何更改除这两个字符之外的所有字符?

C++ 从 regex_iterator 获取匹配项

php - 默认的 PHP 配置是什么?

php - 使用 jQuery 验证插件检查一个或多个复选框(具有不同名称)是否被选中

php - preg_match 到底是如何工作的?

php - 多行的总和并使用 Codeigniter 插入另一列不起作用