Как я могу обрезать строку до первых 20 слов в PHP? - PullRequest
56 голосов
/ 08 июня 2009

Как я могу обрезать строку после 20 слов в PHP?

Ответы [ 27 ]

2 голосов
/ 16 октября 2017

Попробуйте код ниже,

 $text  = implode(' ', array_slice(explode(' ', $text), 0, 32))
 echo $text;
2 голосов
/ 08 июня 2009

Возможно, что-то подобное может сработать:

<?php 
$words = implode(' ', array_slice(split($input, ' ', 21), 0, 20));
2 голосов
/ 08 июня 2009

использовать функцию PHP tokenizer strtok () в цикле.

$token = strtok($string, " "); // we assume that words are separated by sapce or tab
$i = 0;
$first20Words = '';
while ($token !== false && $i < 20) {
    $first20Words .= $token;
    $token = strtok(" ");
    $i++;
}
echo $first20Words;
2 голосов
/ 29 сентября 2011

на основании ответа 動靜 能量:

function truncate_words($string,$words=20) {
 return preg_replace('/((\w+\W*){'.($words-1).'}(\w+))(.*)/', '${1}', $string);
}

или

function truncate_words_with_ellipsis($string,$words=20,$ellipsis=' ...') {
 $new = preg_replace('/((\w+\W*){'.($words-1).'}(\w+))(.*)/', '${1}', $string);
 if($new != $string){
  return $new.$ellipsis;
 }else{
  return $string;
 }

}
1 голос
/ 05 октября 2012

Другое решение:)

$aContent = explode(' ', $cContent);
$cContent = '';
$nCount = count($aContent);
for($nI = 0; ($nI < 20 && $nI < $nCount); $nI++) {
   $cContent .= $aContent[$nI] . ' ';
}
trim($cContent, ' ');
echo '<p>' . $cContent . '</p>';
1 голос
/ 10 января 2012

Вот один, который я использую:

    $truncate = function( $str, $length ) {
        if( strlen( $str ) > $length && false !== strpos( $str, ' ' ) ) {
            $str = preg_split( '/ [^ ]*$/', substr( $str, 0, $length ));
            return htmlspecialchars($str[0]) . '&hellip;';
        } else {
            return htmlspecialchars($str);
        }
    };
    return $truncate( $myStr, 50 );
1 голос
/ 30 сентября 2011

Вот что я реализовал.

function summaryMode($text, $limit, $link) {
    if (str_word_count($text, 0) > $limit) {
        $numwords = str_word_count($text, 2);
        $pos = array_keys($numwords);
        $text = substr($text, 0, $pos[$limit]).'... <a href="'.$link.'">Read More</a>';
    }
    return $text;
}

Как вы можете видеть, это основано на ответе karim79, все, что нужно было изменить, это то, что в операторе if также нужно было проверить слова, а не символы.

Для удобства я также добавил ссылку на основную функцию. Пока это работает безупречно. Благодаря оригинальному поставщику решений.

1 голос
/ 26 декабря 2018

Если вы пишете код на Laravel, просто use Illuminate\Support\Str

вот пример

Str::words($category->publication->title, env('WORDS_COUNT_HOME'), '...')

Надеюсь, это было полезно.

1 голос
/ 19 декабря 2017
function getShortString($string,$wordCount,$etc = true) 
{
     $expString = explode(' ',$string);
     $wordsInString = count($expString);
     if($wordsInString >= $wordCount )
     {
         $shortText = '';
         for($i=0; $i < $wordCount-1; $i++)
         {
             $shortText .= $expString[$i].' ';
         }
         return  $etc ? $shortText.='...' : $shortText; 
     }
     else return $string;
} 
1 голос
/ 03 июня 2015

Это сработало у меня для UNICODE (UTF8) предложений тоже:

function myUTF8truncate($string, $width){
    if (mb_str_word_count($string) > $width) {
        $string= preg_replace('/((\w+\W*|| [\p{L}]+\W*){'.($width-1).'}(\w+))(.*)/', '${1}', $string);
    }
    return $string;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...