如何选择一个句子的前10个单词?

2022-08-30 10:33:09

我如何从输出中只选择前10个单词?


答案 1
implode(' ', array_slice(explode(' ', $sentence), 0, 10));

要添加对逗号和短划线等其他分词符的支持,请提供一种快速的方法,并且不需要拆分字符串:preg_match

function get_words($sentence, $count = 10) {
  preg_match("/(?:\w+(?:\W+|$)){0,$count}/", $sentence, $matches);
  return $matches[0];
}

正如Pebbl所提到的,PHP不能很好地处理UTF-8或Unicode,所以如果这是一个问题,那么你可以替换 和 for 。\w[^\s,\.;\?\!]\W[\s,\.;\?\!]


答案 2

如果句子结构中存在意外字符代替空格,或者句子包含多个连体空格,则简单地拆分空格将不起作用。

无论您在单词之间使用哪种“空格”,以下版本都可以使用,并且可以轻松扩展以处理其他字符...它目前支持任何空格字符加 , 。; ? !

function get_snippet( $str, $wordCount = 10 ) {
  return implode( 
    '', 
    array_slice( 
      preg_split(
        '/([\s,\.;\?\!]+)/', 
        $str, 
        $wordCount*2+1, 
        PREG_SPLIT_DELIM_CAPTURE
      ),
      0,
      $wordCount*2-1
    )
  );
}

正则表达式非常适合此问题,因为您可以轻松地使代码尽可能灵活或严格。但是,您必须小心。我专门针对单词之间的差距(而不是单词本身)处理上述内容,因为很难明确说明定义单词的内容。

取单词边界,或其逆。我很少依赖这些,主要是因为 - 取决于你使用的软件(如某些版本的PHP) - 它们并不总是包含UTF-8或Unicode字符\w\W

在正则表达式中,最好始终保持具体。以便您的表达式可以处理如下内容,无论它们在何处呈现:

echo get_snippet('Это не те дроиды, которые вы ищете', 5);

/// outputs: Это не те дроиды, которые

然而,就性能而言,避免拆分可能是值得的。因此,您可以使用 Kelly 的更新方法,但切换为 和 for 。虽然,我个人喜欢上面使用的拆分表达式的简单性,但它更容易阅读,因此更容易修改。然而,PHP函数的堆栈有点丑陋:)\w[^\s,\.;\?\!]+\W[\s,\.;\?\!]+


推荐