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) ""
}
*/

如何才能做到这一点?

4

3 回答 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) "."
}
于 2013-04-22T00:16:38.450 回答
4

我一直在寻找相同的解决方案并降落在这里。公认的解决方案不适用于非单词字符,如撇号和重音符号等。下面,找到对我有用的解决方案。

这是我的测试语句:

克莱尔最喜欢的钢琴奏鸣曲是莫扎特的第一奏鸣曲。C大调第15首。

接受的答案给了我以下结果:

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] => .
)
于 2015-10-09T19:53:18.473 回答
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."
}
于 2019-06-26T09:39:31.120 回答