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 ...
изменить номер
3в количестве20ниже, чтобы получить первые 20 слов, или передать его в качестве параметра. Ниже показано, как получить первые 3 слова: (так изменить3to20изменить значение по умолчанию):function first3words($s, $limit=3) { return preg_replace('/((\w+\W*){'.($limit-1).'}(\w+))(.*)/', '', $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("")); # => ""
В Ближайшее Пространство
усекает до ближайшего предшествующего пространства персонажа. демо
$strстрока усекается$charsколичество символов, которые будут удалены, может быть переопределено$to_space$to_spacebooleanдля того, чтобы усечь или не усечь из космоса рядом$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--
использовать explode () .
пример из документации.
// Example 1 $pizza = "piece1 piece2 piece3 piece4 piece5 piece6"; $pieces = explode(" ", $pizza); echo $pieces[0]; // piece1 echo $pieces[1]; // piece2обратите внимание, что explode имеет предельную функцию. Так что вы могли бы сделать что-то вроде
$message = implode(" ", explode(" ", $long_message, 20));
простой и полностью оборудованный метод усечения:
function truncate($string, $width, $etc = ' ..') { $wrapped = explode('$trun$', wordwrap($string, $width, '$trun$', false), 2); return $wrapped[0] . (isset($wrapped[1]) ? $etc : ''); }
попробовать регулярное выражение.
вам нужно что-то, что будет соответствовать 20 слов (или 20 границ слов).
Итак (мое регулярное выражение ужасно, поэтому поправьте меня, если это не точно):
/(\w+\b){20}/
Это не мое собственное творение, это модификация предыдущих постов. кредиты идут в 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; }
это выглядит довольно хорошо для меня:
распространенная проблема при создании динамического веб-страницы (где контент поступает из базы данных, управление контентом система или внешний источник как RSS-канал) заключается в том, что входной текст может быть слишком длинным и вызвать макет страницы чтобы 'сломать'.
одним из решений является усечение текста так что он помещается на странице. Этот звучит просто, но часто результаты не так, как ожидалось из-за слов и предложения будут отрезаны в неуместные моменты.
С тремя точками:
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; }
что-то вроде этого, вероятно, может сделать трюк:
<?php $words = implode(' ', array_slice(split($input, ' ', 21), 0, 20));
используйте функцию 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;
на основе ответа 動靜能量:
function truncate_words($string,$words=20) { return preg_replace('/((\w+\W*){'.($words-1).'}(\w+))(.*)/', '', $string); }или
function truncate_words_with_ellipsis($string,$words=20,$ellipsis=' ...') { $new = preg_replace('/((\w+\W*){'.($words-1).'}(\w+))(.*)/', '', $string); if($new != $string){ return $new.$ellipsis; }else{ return $string; } }
вот что я реализовал.
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 также должен был проверять слова, а не символы.
Я также добавил ссылку на основную функцию для удобства. До сих пор он имеет работал безупречно. Благодаря оригинальному поставщику решений.
вот один я использую:
$truncate = function( $str, $length ) { if( strlen( $str ) > $length && false !== strpos( $str, ' ' ) ) { $str = preg_split( '/ [^ ]*$/', substr( $str, 0, $length )); return htmlspecialchars($str[0]) . '…'; } else { return htmlspecialchars($str); } }; return $truncate( $myStr, 50 );
другое решение :)
$aContent = explode(' ', $cContent); $cContent = ''; $nCount = count($aContent); for($nI = 0; ($nI < 20 && $nI < $nCount); $nI++) { $cContent .= $aContent[$nI] . ' '; } trim($cContent, ' '); echo '<p>' . $cContent . '</p>';
это сработало для меня UNICODE (UTF8) фраз:
function myUTF8truncate($string, $width){ if (mb_str_word_count($string) > $width) { $string= preg_replace('/((\w+\W*|| [\p{L}]+\W*){'.($width-1).'}(\w+))(.*)/', '', $string); } return $string; }
ограничить словами, я использую следующий код :
$string = "hello world ! I love chocolate."; $explode = array_slice(explode(' ', $string), 0, 4); $implode = implode(" ",$explode); echo $implode;$implot даст: hello world ! Я
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; }
предположим, у нас есть строковые переменные $ string, $start и $ limit мы можем заимствовать 3 или 4 функции из PHP для достижения этой цели. Они таковы:
- script_tags () PHP функция для удаления ненужных HTML и PHP теги (если они есть). Это не будет необходимо, если нет HTML или PHP тегов.
- explode () разделить $ string в массив
- array_splice () указать количество слов и где начнется от. Это будет контролироваться vallues приписаны к нашей $start и $ limit переменные.
и наконец, 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; }Это очень просто..
Я надеюсь, что это было полезно.
Я сделал свою функцию:
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; }
function limitText($string,$limit){ if(strlen($string) > $limit){ $string = substr($string, 0,$limit) . "..."; } return $string; }это вернет 20 слов. Я надеюсь, что это поможет
а как же
chunk_split($str,20);запись в руководство PHP
Comments