Як я можу отримати перші n символів рядка в PHP? Який найшвидший спосіб обрізати рядок до певної кількості символів та додати "...", якщо потрібно?
Як я можу отримати перші n символів рядка в PHP? Який найшвидший спосіб обрізати рядок до певної кількості символів та додати "...", якщо потрібно?
Відповіді:
//The simple version for 10 Characters from the beginning of the string
$string = substr($string,0,10).'...';
Оновлення:
На основі пропозиції щодо перевірки довжини (а також забезпечення однакової довжини на обрізаних та необрізних рядках):
$string = (strlen($string) > 13) ? substr($string,0,10).'...' : $string;
Так ви отримаєте рядок максимум 13 символів; або 13 (або менше) звичайних символів, або 10 символів, а потім "..."
Оновлення 2:
Або як функція:
function truncate($string, $length, $dots = "...") {
return (strlen($string) > $length) ? substr($string, 0, $length - strlen($dots)) . $dots : $string;
}
Оновлення 3:
Минув час, коли я написав цю відповідь, і я фактично вже не використовую цей код. Я віддаю перевагу цій функції, яка запобігає розриву рядка в середині слова за допомогою wordwrap
функції:
function truncate($string,$length=100,$append="…") {
$string = trim($string);
if(strlen($string) > $length) {
$string = wordwrap($string, $length);
$string = explode("\n", $string, 2);
$string = $string[0] . $append;
}
return $string;
}
$string = wordwrap($string, $length - sizeof($append));
?
Ця функціональність вбудована в PHP з версії 4.0.6. Дивіться документи .
echo mb_strimwidth('Hello World', 0, 10, '...');
// outputs Hello W...
Зауважимо, що trimmarker
(еліпси вище) включені в усічену довжину.
Мультибайтове розширення може стати в нагоді, якщо вам потрібен контроль над струнною схемою.
$charset = 'UTF-8';
$length = 10;
$string = 'Hai to yoo! I like yoo soo!';
if(mb_strlen($string, $charset) > $length) {
$string = mb_substr($string, 0, $length - 3, $charset) . '...';
}
іноді вам потрібно обмежити рядок останнім повним словом, тобто: ви не хочете, щоб останнє слово було порушено, замість цього ви зупиняєтесь на другому останньому слові.
наприклад: нам потрібно обмежити "Це моя рядок" на 6 знаків, але замість "Це я ..." ми хочемо, щоб це було "Це ...", тобто ми пропустимо останні розбиті літери в останньому слові.
фе, я погано пояснюю, ось код.
class Fun {
public function limit_text($text, $len) {
if (strlen($text) < $len) {
return $text;
}
$text_words = explode(' ', $text);
$out = null;
foreach ($text_words as $word) {
if ((strlen($word) > $len) && $out == null) {
return substr($word, 0, $len) . "...";
}
if ((strlen($out) + strlen($word)) > $len) {
return $out . "...";
}
$out.=" " . $word;
}
return $out;
}
}
Якщо ви хочете вирішити, будьте обережні, щоб не ділити слова, можете зробити наступне
function ellipse($str,$n_chars,$crop_str=' [...]')
{
$buff=strip_tags($str);
if(strlen($buff) > $n_chars)
{
$cut_index=strpos($buff,' ',$n_chars);
$buff=substr($buff,0,($cut_index===false? $n_chars: $cut_index+1)).$crop_str;
}
return $buff;
}
якщо $ str коротше, ніж $ n_chars повертає його недоторканим.
Якщо $ str дорівнює $ n_chars, вона повертається так само, як і.
якщо $ str довше $ n_chars, то він шукає наступний пробіл, або (якщо до кінця немає пробілів), то $ str замінюється брутально замість $ n_chars.
ПРИМІТКА: майте на увазі, що цей метод видалить усі теги у випадку HTML.
Рамка кодарінтера містить помічник для цього, який називається "текстовий помічник". Ось деяка документація із посібника користувача codeigniter, що застосовується: http://codeigniter.com/user_guide/helpers/text_helper.html (просто прочитайте розділи word_limiter та character_limiter). Ось дві функції, пов'язані з вашим питанням:
if ( ! function_exists('word_limiter'))
{
function word_limiter($str, $limit = 100, $end_char = '…')
{
if (trim($str) == '')
{
return $str;
}
preg_match('/^\s*+(?:\S++\s*+){1,'.(int) $limit.'}/', $str, $matches);
if (strlen($str) == strlen($matches[0]))
{
$end_char = '';
}
return rtrim($matches[0]).$end_char;
}
}
І
if ( ! function_exists('character_limiter'))
{
function character_limiter($str, $n = 500, $end_char = '…')
{
if (strlen($str) < $n)
{
return $str;
}
$str = preg_replace("/\s+/", ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str));
if (strlen($str) <= $n)
{
return $str;
}
$out = "";
foreach (explode(' ', trim($str)) as $val)
{
$out .= $val.' ';
if (strlen($out) >= $n)
{
$out = trim($out);
return (strlen($out) == strlen($str)) ? $out : $out.$end_char;
}
}
}
}
Використовуйте підрядку
http://php.net/manual/en/function.substr.php
$foo = substr("abcde",0, 3) . "...";
Функція, яку я використав:
function cutAfter($string, $len = 30, $append = '...') {
return (strlen($string) > $len) ?
substr($string, 0, $len - strlen($append)) . $append :
$string;
}
Побачити це в дії .
Я розробив функцію для цього використання
function str_short($string,$limit)
{
$len=strlen($string);
if($len>$limit)
{
$to_sub=$len-$limit;
$crop_temp=substr($string,0,-$to_sub);
return $crop_len=$crop_temp."...";
}
else
{
return $string;
}
}
Ви просто викличте функцію шпагатом і Limite
наприклад: str_short("hahahahahah",5)
;
він виріже ваш рядок і додасть "..." наприкінці
:)
Для створення функції (для повторного використання) та обмеженої динамічної довжини використовуйте:
function string_length_cutoff($string, $limit, $subtext = '...')
{
return (strlen($string) > $limit) ? substr($string, 0, ($limit-strlen(subtext))).$subtext : $string;
}
// example usage:
echo string_length_cutoff('Michelle Lee Hammontree-Garcia', 26);
// or (for custom substitution text
echo string_length_cutoff('Michelle Lee Hammontree-Garcia', 26, '..');
Краще абстрагувати такий код, як ви так (зауважте, що ліміт є необов’язковим і за замовчуванням до 10):
print limit($string);
function limit($var, $limit=10)
{
if ( strlen($var) > $limit )
{
return substr($string, 0, $limit) . '...';
}
else
{
return $var;
}
}
$limit + 3
те, щоб ви не обрізали рядок трохи більше межі. Залежно від вашої програми (наприклад, вихід HTML), …
замість цього використовуйте сутність (типографічно приємніше). Як було запропоновано раніше, обріжте будь-які не букви від кінця (укороченого) рядка, перш ніж додавати еліпсис. Нарешті, слідкуйте, чи перебуваєте ви в багатобайтовому (наприклад, UTF-8) середовищі - ви не можете використовувати strlen () та substr ().
Я не впевнений, чи це найшвидше рішення, але, схоже, це найкоротше:
$result = current(explode("\n", wordwrap($str, $width, "...\n")));
PS Дивіться приклади тут https://stackoverflow.com/a/17852480/131337
це рішення не виріже слова, воно додасть три крапки після першого пробілу. Я відредагував рішення @ Raccoon29 і замінив усі функції функціями mb_, щоб це працювало для всіх мов, таких як арабська
function cut_string($str, $n_chars, $crop_str = '...') {
$buff = strip_tags($str);
if (mb_strlen($buff) > $n_chars) {
$cut_index = mb_strpos($buff, ' ', $n_chars);
$buff = mb_substr($buff, 0, ($cut_index === false ? $n_chars : $cut_index + 1), "UTF-8") . $crop_str;
}
return $buff;
}
$yourString = "bla blaaa bla blllla bla bla";
$out = "";
if(strlen($yourString) > 22) {
while(strlen($yourString) > 22) {
$pos = strrpos($yourString, " ");
if($pos !== false && $pos <= 22) {
$out = substr($yourString,0,$pos);
break;
} else {
$yourString = substr($yourString,0,$pos);
continue;
}
}
} else {
$out = $yourString;
}
echo "Output String: ".$out;
Якщо немає жодної жорсткої вимоги щодо довжини усіченої рядка, можна використовувати це для усічення та запобігання вирізання останнього слова:
$text = "Knowledge is a natural right of every human being of which no one
has the right to deprive him or her under any pretext, except in a case where a
person does something which deprives him or her of that right. It is mere
stupidity to leave its benefits to certain individuals and teams who monopolize
these while the masses provide the facilities and pay the expenses for the
establishment of public sports.";
// we don't want new lines in our preview
$text_only_spaces = preg_replace('/\s+/', ' ', $text);
// truncates the text
$text_truncated = mb_substr($text_only_spaces, 0, mb_strpos($text_only_spaces, " ", 50));
// prevents last word truncation
$preview = trim(mb_substr($text_truncated, 0, mb_strrpos($text_truncated, " ")));
У цьому випадку $preview
буде "Knowledge is a natural right of every human being"
.
Приклад прямого коду: http://sandbox.onlinephpfunctions.com/code/25484a8b687d1f5ad93f62082b6379662a6b4713