如何从输出中仅选择前10个单词?
答案 0 :(得分:123)
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
的{{1}}和[^\s,\.;\?\!]
替换\W
{1}}。
答案 1 :(得分:52)
如果在句子结构中有一个意外的字符代替空格,或者如果句子包含多个连接的空格,则简单地拆分空格将无法正常工作。
以下版本无论您在单词之间使用何种“空格”都可以使用,并且可以轻松扩展以处理其他字符...它目前支持任何空格字符加,。 ; ? !
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) - they don't always include UTF-8 or Unicode characters。
在正则表达式中,最好始终具体。这样你的表达式就可以处理以下内容,无论它们在何处呈现:
echo get_snippet('Это не те дроиды, которые вы ищете', 5);
/// outputs: Это не те дроиды, которые
但是,就性能而言,避免分裂可能是值得的。因此,您可以使用Kelly的更新方法,但为\w
切换[^\s,\.;\?\!]+
,为\W
切换[\s,\.;\?\!]+
。虽然,我个人喜欢上面使用的分裂表达式的简单性,但它更容易阅读并因此修改。然而,PHP函数的堆栈有点难看:)
答案 2 :(得分:6)
http://snipplr.com/view/8480/a-php-function-to-return-the-first-n-words-from-a-string/
function shorten_string($string, $wordsreturned)
{
$retval = $string; // Just in case of a problem
$array = explode(" ", $string);
/* Already short enough, return the whole thing*/
if (count($array)<=$wordsreturned)
{
$retval = $string;
}
/* Need to chop of some words*/
else
{
array_splice($array, $wordsreturned);
$retval = implode(" ", $array)." ...";
}
return $retval;
}
答案 3 :(得分:3)
我建议使用str_word_count
:
<?php
$str = "Lorem ipsum dolor sit amet,
consectetur adipiscing elit";
print_r(str_word_count($str, 1));
?>
以上示例将输出:
Array
(
[0] => Lorem
[1] => ipsum
[2] => dolor
[3] => sit
[4] => amet
[5] => consectetur
[6] => adipiscing
[7] => elit
)
使用循环来获取您想要的单词。
答案 4 :(得分:2)
要选择给定文本的10个单词,您可以实现以下功能:
function first_words($text, $count=10)
{
$words = explode(' ', $text);
$result = '';
for ($i = 0; $i < $count && isset($words[$i]); $i++) {
$result .= $words[$i];
}
return $result;
}
答案 5 :(得分:2)
使用str_word_count()
$first10words = implode(' ', array_slice(str_word_count($sentence,1), 0, 10));
答案 6 :(得分:1)
这可能会对你有所帮助。函数返回N否。的话
public function getNWordsFromString($text,$numberOfWords = 6)
{
if($text != null)
{
$textArray = explode(" ", $text);
if(count($textArray) > $numberOfWords)
{
return implode(" ",array_slice($textArray, 0, $numberOfWords))."...";
}
return $text;
}
return "";
}
}
答案 7 :(得分:1)
试试这个
$str = 'Lorem ipsum dolor sit amet,consectetur adipiscing elit. Mauris ornare luctus diam sit amet mollis.';
$arr = explode(" ", str_replace(",", ", ", $str));
for ($index = 0; $index < 10; $index++) {
echo $arr[$index]. " ";
}
我知道现在不是回答的时候,但让新来的人选择自己的答案。
答案 8 :(得分:0)
这完全是我们正在寻找的东西 只需将n粘贴到您的程序中即可运行。
function shorten_string($string, $wordsreturned)
/* Returns the first $wordsreturned out of $string. If string
contains fewer words than $wordsreturned, the entire string
is returned.
*/
{
$retval = $string; // Just in case of a problem
$array = explode(" ", $string);
if (count($array)<=$wordsreturned)
/* Already short enough, return the whole thing
*/
{
$retval = $string;
}
else
/* Need to chop of some words
*/
{
array_splice($array, $wordsreturned);
$retval = implode(" ", $array)." ...";
}
return $retval;
}
只需在
中调用代码块中的函数即可$data_itr = shorten_string($Itinerary,25);
答案 9 :(得分:0)
我是这样做的:
function trim_by_words($string, $word_count = 10) {
$string = explode(' ', $string);
if (empty($string) == false) {
$string = array_chunk($string, $word_count);
$string = $string[0];
}
$string = implode(' ', $string);
return $string;
}
与UTF8兼容......
答案 10 :(得分:0)
这可能会对你有所帮助。功能返回 10 no. of words
。
function num_of_word($text,$numb) {
$wordsArray = explode(" ", $text);
$parts = array_chunk($wordsArray, $numb);
$final = implode(" ", $parts[0]);
if(isset($parts[1]))
$final = $final." ...";
return $final;
return;
}
echo num_of_word($text, 10);
答案 11 :(得分:0)
function get_first_num_of_words($string, $num_of_words)
{
$string = preg_replace('/\s+/', ' ', trim($string));
$words = explode(" ", $string); // an array
// if number of words you want to get is greater than number of words in the string
if ($num_of_words > count($words)) {
// then use number of words in the string
$num_of_words = count($words);
}
$new_string = "";
for ($i = 0; $i < $num_of_words; $i++) {
$new_string .= $words[$i] . " ";
}
return trim($new_string);
}
像这样使用:
echo get_first_num_of_words("Lorem ipsum dolor sit amet consectetur adipisicing elit. Aliquid, illo?", 5);
输出:Lorem ipsum dolor sit amet
此功能也适用于阿拉伯字符等unicode字符。
echo get_first_num_of_words("نموذج لنص عربي الغرض منه توضيح كيف يمكن استخلاص أول عدد معين من الكلمات الموجودة فى نص معين.", 100);
输出:نموذج لنص عربي الغرض منه توضيح كيف يمكن استخلاص أول عدد معين من الكلمات الموجودة فى نص معين.
答案 12 :(得分:-4)
当内置Wordpress功能时,我不知道为什么会出现这种混乱:
<?= wp_trim_words(get_the_content(), 15, '...') ?>
回复内容的前15个单词(它在常规循环中工作)并添加省略号。