如何将一句话分割成单词和标点符号?

4
例如,我想分割这个句子:
I am a sentence.

将其拆分为包含5个部分的数组: I, am, a, sentence, 和 ..

我目前使用的是 preg_split,之前使用过 explode,但似乎都不太适合。

这是我尝试过的内容:

$sentence = explode(" ", $sentence);
/*
returns array(4) {
  [0]=>
  string(1) "I"
  [1]=>
  string(2) "am"
  [2]=>
  string(1) "a"
  [3]=>
  string(8) "sentence."
}
*/

同时,还有以下内容:

$sentence = preg_split("/[.?!\s]/", $sentence);
/*
returns array(5) {
  [0]=>
  string(1) "I"
  [1]=>
  string(2) "am"
  [2]=>
  string(1) "a"
  [3]=>
  string(8) "sentence"
  [4]=>
  string(0) ""
}
*/

这该怎么做呢?
3个回答

6

您可以按单词边界拆分:

$sentence = preg_split("/(?<=\w)\b\s*/", 'I am a sentence.');

几乎所有的正则表达式都会扫描直到找到一个单词字符,然后在它之后,正则表达式必须捕获一个单词边界和一些可选空格。
输出:链接
array(5) {
  [0]=>
  string(1) "I"
  [1]=>
  string(2) "am"
  [2]=>
  string(1) "a"
  [3]=>
  string(8) "sentence"
  [4]=>
  string(1) "."
}

1
这对于包含非单词字符的句子无效。换句话说,如果句子中包含撇号,那么分解就会出错。 - dlporter98

4
我正在寻找相同的解决方案并来到这里。被接受的答案无法处理像撇号和重音符等非单词字符。下面是对我起作用的解决方案。
这是我的测试句子:
Claire's favorite sonata for piano is Mozart's Sonata no. 15 in C Major.
被接受的答案给了我以下结果:
Array
(
    [0] => Claire
    [1] => ’s
    [2] => favorite
    [3] => sonata
    [4] => for
    [5] => piano
    [6] => is
    [7] => Mozart
    [8] => ’s
    [9] => Sonata
    [10] => no
    [11] => . 15
    [12] => in
    [13] => C
    [14] => Major
    [15] => .
)

我想分享一下我提出的解决方案,如下所示:
$parts = preg_split("/\s+|\b(?=[!\?\.])(?!\.\s+)/", $sentence);

它给出以下结果:
Array
(
    [0] => Claire’s
    [1] => favorite
    [2] => sonata
    [3] => for
    [4] => piano
    [5] => is
    [6] => Mozart’s
    [7] => Sonata
    [8] => no.
    [9] => 15
    [10] => in
    [11] => C
    [12] => Major
    [13] => .
)

0

如果有人对一个简单的解决方案感兴趣,该方案会忽略标点符号

preg_split( '/[^a-zA-Z0-9]+/', 'I am a sentence' );

会分割成

array(4) {
  [0]=>
  string(1) "I"
  [1]=>
  string(2) "am"
  [2]=>
  string(1) "a"
  [3]=>
  string(8) "sentence"
}

或者一种替代方案是将标点符号包含在相邻的单词中。
preg_split( '/\b[^a-zA-Z0-9]+\b/', 'I am a sentence.' );

会分割成

array(4) {
  [0]=>
  string(1) "I"
  [1]=>
  string(2) "am"
  [2]=>
  string(1) "a"
  [3]=>
  string(8) "sentence."
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接