Как усечь текст после определенного количества слов и добавить элемент readmore? [Дубликат]

Если вы применяете статическое ключевое слово к любому методу, оно известно как статический метод.

  1. Статический метод принадлежит классу, а не классу объекта.
  2. Статический метод, вызываемый без необходимости создания экземпляра класса. Статический метод
  3. может получить доступ к статическому элементу данных и может изменить его значение.

// Программа изменения общего свойства всех объектов (статическое поле).

class Student9{  
 int rollno;  
 String name;  
 static String college = "ITS";  

 static void change(){  
 college = "BBDIT";  
 }  

 Student9(int r, String n){  
 rollno = r;  
 name = n;  
 }  

 void display (){System.out.println(rollno+" "+name+" "+college);}  

public static void main(String args[]){  
Student9.change();  

Student9 s1 = new Student9 (111,"Indian");  
Student9 s2 = new Student9 (222,"American");  
Student9 s3 = new Student9 (333,"China");  

s1.display();  
s2.display();  
s3.display();  
}  }

O / P: 111 Индийский BBDIT 222 Американский BBDIT 333 Китай BBDIT

51
задан glh 13 April 2013 в 11:28
поделиться

24 ответа

function limit_text($text, $limit) {
      if (str_word_count($text, 0) > $limit) {
          $words = str_word_count($text, 2);
          $pos = array_keys($words);
          $text = substr($text, 0, $pos[$limit]) . '...';
      }
      return $text;
    }

echo limit_text('Hello here is a long sentence blah blah blah blah blah hahahaha haha haaaaaa', 5);

Выходы:

Hello here is a long ...
113
ответ дан VisioN 17 August 2018 в 15:56
поделиться
  • 1
    Эта функция сбивает количество символов и количество слов при использовании $ limit в одном случае в качестве селектора слов массива $ pos и в другом, определяя, достаточно ли строки. – Aaron 6 July 2010 в 20:21
  • 2
    В приведенном примере передача в значении 5 гарантирует, что функция будет действовать на любое слово длиной более 5 символов, так что если тестовый пример был «Hello here», функция не работает и возвращает только «... & Quot; – Aaron 6 July 2010 в 20:42
  • 3
    @Tegeril - отметил, удалит этот пост. Спасибо. – karim79 6 July 2010 в 22:01
  • 4
    str_word_count вместо strlen должен выполнить трюк :), поэтому замените strlen($text) на str_word_count($text,0) – Val 21 February 2012 в 17:26
  • 5
    Обратите внимание на str_word_count ($ text, 2) из ​​docs For the purpose of this function, 'word' is defined as a locale dependent string containing alphabetic characters, which also may contain, but not start with "'" and "-" characters., вы можете указать дополнительные символы в третьем параметре или просто использовать preg_split('/[\s]+/' $text); для разделения по пробелу. – Chris Hanson 23 September 2013 в 22:19

Простой и полностью экипированный метод truncate ():

function truncate($string, $width, $etc = ' ..')
{
    $wrapped = explode('$trun$', wordwrap($string, $width, '$trun$', false), 2);
    return $wrapped[0] . (isset($wrapped[1]) ? $etc : '');
}
6
ответ дан acecream 17 August 2018 в 15:56
поделиться
  • 1
    Это то, что я использую .. собирался добавить что-то вроде этого в качестве ответа, чтобы вы вместо этого выставляли ;-) – billynoah 1 February 2016 в 22:38

Это выглядит довольно хорошо для меня :

Общая проблема при создании динамических веб-страниц (где контент получен из базы данных, системы управления контентом или внешнего источника например, RSS-канал) заключается в том, что входной текст может быть слишком длинным и привести к разрыву макета страницы.

Одним из решений является усечение текста так, чтобы он соответствовал странице. Это звучит просто, но часто результаты не ожидаются из-за того, что слова и предложения отключены в неподходящих точках.

4
ответ дан Andrew Hare 17 August 2018 в 15:56
поделиться

Попробуйте regex.

Вам понадобится что-то, что соответствует 20 словам (или 20 границам слов).

Итак (мое регулярное выражение ужасно, так что правильно, если это не точно ):

/(\w+\b){20}/

И вот некоторые примеры регулярного выражения в php .

5
ответ дан Assaf Lavie 17 August 2018 в 15:56
поделиться
function limitText($string,$limit){
        if(strlen($string) > $limit){
                $string = substr($string, 0,$limit) . "...";
        }
        return $string;
}

это вернет 20 слов. Надеюсь, это поможет

0
ответ дан Community 17 August 2018 в 15:56
поделиться

на основе ответа 動靜 answer:

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;
 }

}
2
ответ дан cwd 17 August 2018 в 15:56
поделиться

Предположим, что у нас есть строковые переменные $ string, $ start и $ limit, мы можем взять 3 или 4 функции из PHP для достижения этого. Это:

  • script_tags () Функция PHP для удаления ненужных тегов HTML и PHP (если таковые имеются). Это не обязательно, если нет HTML или PHP-тегов.
  • explode (), чтобы разделить строку $ на массив
  • array_splice (), чтобы указать количество слов и где это начнется с. Это будет контролироваться vallues, назначенными нашим $ start и $ limit variables.
  • и, наконец, implode (), чтобы присоединиться к элементам массива в вашу укороченную строку ..
    function truncateString($string, $start, $limit){
        $stripped_string =strip_tags($string); // if there are HTML or PHP tags
        $string_array =explode(' ',$stripped_string);
        $truncated_array = array_splice($string_array,$start,$limit);
        $truncated_string=implode(' ',$truncated_array);
    
        return $truncated_string;
    }
    

Это просто ..

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

0
ответ дан drGreen 17 August 2018 в 15:56
поделиться
  • 1
    Что это значит, что буквально десятки ответов на этот вопрос уже нет? – GordonM 20 June 2018 в 14:02
  • 2
    У него есть объяснение, по крайней мере, новичок по достоинству оценят это. – drGreen 20 June 2018 в 14:17

Чтобы ограничить слова, я использую следующий небольшой код:

    $string = "hello world ! I love chocolate.";
    $explode = array_slice(explode(' ', $string), 0, 4);
    $implode = implode(" ",$explode);   
    echo $implode;

$ implot даст: hello world! I

1
ответ дан Edouard 17 August 2018 в 15:56
поделиться

использовать функцию tokenizer PHP 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
ответ дан farzad 17 August 2018 в 15:56
поделиться

как насчет

chunk_split($str,20);

Запись в Справочник PHP

-1
ответ дан fly.floh 17 August 2018 в 15:56
поделиться
  • 1
    Это не полезно, потому что оно не распознает слова, просто строку / длину символа. – mickmackusa 9 November 2017 в 23:52

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

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
ответ дан foochow 17 August 2018 в 15:56
поделиться
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
ответ дан Hamed B 17 August 2018 в 15:56
поделиться

К ближайшему пространству

Усекает до ближайшего предшествующего пространства целевого символа. Демо

  • $str Строка, подлежащая усечению
  • $chars Количество символов, которые нужно удалить, может быть переопределено $to_space
  • $to_space boolean для того, чтобы усечь из космоса вблизи предела $chars

Функция

function truncateString($str, $chars, $to_space, $replacement="...") {
   if($chars > strlen($str)) return $str;

   $str = substr($str, 0, $chars);
   $space_pos = strrpos($str, " ");
   if($to_space && $space_pos >= 0) 
       $str = substr($str, 0, strrpos($str, " "));

   return($str . $replacement);
}

Образец

<?php

$str = "this is a string that is just some text for you to test with";

print(truncateString($str, 20, false) . "\n");
print(truncateString($str, 22, false) . "\n");
print(truncateString($str, 24, true) . "\n");
print(truncateString($str, 26, true, " :)") . "\n");
print(truncateString($str, 28, true, "--") . "\n");

?>

Выход

this is a string tha...
this is a string that ...
this is a string that...
this is a string that is :)
this is a string that is--
9
ответ дан Jacksonkr 17 August 2018 в 15:56
поделиться

Попробуйте ввести код,

 $text  = implode(' ', array_slice(explode(' ', $text), 0, 32))
 echo $text;
2
ответ дан Jaywant Khedkar 17 August 2018 в 15:56
поделиться

Вот один из них:

    $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
ответ дан John Syrinek 17 August 2018 в 15:56
поделиться

Разделите строку (в массив) на < space >, а затем возьмите первые 20 элементов этого массива.

4
ответ дан lance 17 August 2018 в 15:56
поделиться

Измените число 3 на число 20 ниже, чтобы получить первые 20 слов или передать его как параметр. Ниже показано, как получить первые 3 слова: (поэтому измените значение 3 на 20, чтобы изменить значение по умолчанию):

function first3words($s, $limit=3) {
    return preg_replace('/((\w+\W*){'.($limit-1).'}(\w+))(.*)/', '${1}', $s);   
}

var_dump(first3words("hello yes, world wah ha ha"));  # => "hello yes, world"
var_dump(first3words("hello yes,world wah ha ha"));   # => "hello yes,world"
var_dump(first3words("hello yes world wah ha ha"));   # => "hello yes world"
var_dump(first3words("hello yes world"));  # => "hello yes world"
var_dump(first3words("hello yes world.")); # => "hello yes world"
var_dump(first3words("hello yes"));  # => "hello yes"
var_dump(first3words("hello"));  # => "hello"
var_dump(first3words("a")); # => "a"
var_dump(first3words(""));  # => ""
24
ответ дан Martijn 17 August 2018 в 15:56
поделиться
  • 1
    Удивительно, что это самый быстрый путь для ограничения слов, это работает немного лучше, чем взрывается, отличная работа, хорошо сделано. – VeeeneX 1 July 2015 в 04:58

использовать explode () .

Пример из документов.

// Example 1
$pizza  = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);
echo $pieces[0]; // piece1
echo $pieces[1]; // piece2

Обратите внимание, что в режиме разрыва функция ограничения. Таким образом, вы можете сделать что-то вроде

$message = implode(" ", explode(" ", $long_message, 20));
7
ответ дан Matthew Vines 17 August 2018 в 15:56
поделиться
  • 1
    +1 WOW, я использовал взрыв с самого начала, и я никогда не замечал аргумент $ limit раньше. – Alix Axel 13 August 2009 в 10:19
  • 2
    Функция ограничения разлома не действует в этом контексте. См. php.net/manual/en/function.explode.php Пример №2, положительный предел. – Aaron 6 July 2010 в 20:48
  • 3
    @Tegeril верен. Хотя это исправит это: $words = implode(" ", array_slice( explode(" ", $t), 0, $count) ); – Dominik 1 February 2014 в 02:02

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

<?php 
$words = implode(' ', array_slice(split($input, ' ', 21), 0, 20));
2
ответ дан mikl 17 August 2018 в 15:56
поделиться

Это не мое собственное творение, его модификация предыдущих сообщений. кредиты идут на karim79.

function limit_text($text, $limit) {
    $strings = $text;
      if (strlen($text) > $limit) {
          $words = str_word_count($text, 2);
          $pos = array_keys($words);
          if(sizeof($pos) >$limit)
          {
            $text = substr($text, 0, $pos[$limit]) . '...';
          }
          return $text;
      }
      return $text;
    }
5
ответ дан Mixcels 17 August 2018 в 15:56
поделиться

Я сделал свою функцию:

function summery($text, $limit) {
    $words=preg_split('/\s+/', $text);
     $count=count(preg_split('/\s+/', $text));
      if ($count > $limit) {
          $text=NULL;
          for($i=0;$i<$limit;$i++)
              $text.=$words[$i].' ';
          $text.='...';
      }
      return $text;
    }
0
ответ дан Omar N Shamali 17 August 2018 в 15:56
поделиться

Это тоже работало для предложений 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;
}
1
ответ дан T.Todua 17 August 2018 в 15:56
поделиться

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

$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
ответ дан thejaeck.net 17 August 2018 в 15:56
поделиться

С тройными точками:

function limitWords($text, $limit) {
    $word_arr = explode(" ", $text);

    if (count($word_arr) > $limit) {
        $words = implode(" ", array_slice($word_arr , 0, $limit) ) . ' ...';
        return $words;
    }

    return $text;
}
3
ответ дан Vladyslav Melnychenko 17 August 2018 в 15:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: