为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
一只斗牛犬 2019-12-02 09:54:24
我如何从输出中仅选择前10个字?
查看完整描述

3 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

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那么好,所以如果这是一个问题,那么你可以替换\w为[^\s,\.;\?\!]与\W对[\s,\.;\?\!]。


查看完整回答
反对 回复 2019-12-02
?
largeQ

TA贡献2039条经验 获得超7个赞

如果在句子结构中有一个意外的字符代替空格,或者如果句子包含多个连在一起的空格,则仅对空格进行拆分将无法正常工作。


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


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

    )

  );

}

正则表达式非常适合此问题,因为您可以轻松地使代码随心所欲地灵活或严格。但是,您一定要小心。我专门针对上述单词之间的差异(而不是单词本身)进行了上述处理,因为很难明确地说明单词的定义。


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


在正则表达式中,最好始终保持具体。这样,无论在何处呈现表达式,表达式都可以处理以下内容:


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


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

但是,就性能而言,避免拆分可能是值得的。所以,你可以用凯利的更新方法,但切换\w为[^\s,\.;\?\!]+与\W对[\s,\.;\?\!]+。尽管就我个人而言,我喜欢上面使用的拆分表达式的简单性,但它更易于阅读和修改。但是,PHP函数的堆栈有点难看:)


查看完整回答
反对 回复 2019-12-02
  • 3 回答
  • 0 关注
  • 434 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信