【问题标题】:How can I split a sentence into words and punctuation marks?如何将句子拆分为单词和标点符号?
【发布时间】:2013-04-14 19:00:40
【问题描述】:

例如,我想拆分这句话:

I am a sentence.

变成一个有5个部分的数组; Iamasentence.

在尝试explode 之后,我目前正在使用preg_split,但我似乎找不到合适的东西。

这是我尝试过的:

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

如何做到这一点?

【问题讨论】:

    标签: php regex string preg-split text-segmentation


    【解决方案1】:

    您可以在单词边界上拆分:

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

    几乎正则表达式扫描直到找到一个单词字符,然后在它之后,正则表达式必须捕获一个单词边界和一些可选空间。

    Output:

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

    【讨论】:

    • 这不适用于非单词字符的句子。换句话说,如果句子中包含撇号,则分解被抛出
    【解决方案2】:

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

    这是我的测试语句:

    克莱尔最喜欢的钢琴奏鸣曲是莫扎特的第一奏鸣曲。 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] => .
    )
    

    【讨论】:

      【解决方案3】:

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

      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."
      }
      

      【讨论】:

        猜你喜欢
        • 2020-01-11
        • 1970-01-01
        • 2010-09-26
        • 2011-11-10
        • 1970-01-01
        • 1970-01-01
        • 2012-11-16
        相关资源
        最近更新 更多