如何选择一个句子的前10个单词?
我如何从输出中只选择前10个单词?
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,\.;\?\!]
如果句子结构中存在意外字符代替空格,或者句子包含多个连体空格,则简单地拆分空格将不起作用。
无论您在单词之间使用哪种“空格”,以下版本都可以使用,并且可以轻松扩展以处理其他字符...它目前支持任何空格字符加 , 。; ? !
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,\.;\?\!]+