Получить первые n символов строки

Как я могу получить первые 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; } 

Это было встроено в PHP с версии 4.0.6, я удивлен сочетанием возраста этого вопроса и того факта, что никто не упомянул об этом ни в одном из ответов

из документов: http://www.php.net/manual/en/function.mb-strimwidth.php

 echo mb_strimwidth("Hello World", 0, 10, "..."); // outputs Hello W... 

Расширение Multibyte может пригодиться, если вам нужно управлять строкой charset.

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

Структура codeigniter содержит помощника для этого, называемого «текстовым помощником». Вот некоторые документы из руководства пользователя 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 = '&#8230;') { 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 = '&#8230;') { 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; } } } } 

Если вы хотите сократить осторожность, чтобы не разделить слова, вы можете сделать следующее

 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.

Использовать подстроку

http://php.net/manual/en/function.substr.php

 $foo = substr("abcde",0, 3) . "..."; 
 if(strlen($text) > 10) $text = substr($text,0,10) . "..."; 

Функция, которую я использовал:

 function cutAfter($string, $len = 30, $append = '...') { return (strlen($string) > $len) ? substr($string, 0, $len - strlen($append)) . $append : $string; } 

Смотрите в действии .

Вот что я делаю

  function cutat($num, $tt){ if (mb_strlen($tt)>$num){ $tt=mb_substr($tt,0,$num-2).'...'; } return $tt; } 

где $ num – количество символов, а $ tt – строка для манипуляции.

Я разработал функцию для этого использования

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

Я не уверен, что это самое быстрое решение, но похоже, что оно самое короткое:

 $result = current(explode("\n", wordwrap($str, $width, "...\n"))); 

PS См. Некоторые примеры здесь https://stackoverflow.com/a/17852480/131337

substr () было бы лучше всего, вы также захотите сначала проверить длину строки

 $str = 'someLongString'; $max = 7; if(strlen($str) > $max) { $str = substr($str, 0, $max) . '...'; } 

wordwrap не будет обрезать строку вниз, просто раздели ее …

$ width = 10;

 $a = preg_replace ("~^(.{{$width}})(.+)~", '\\1…', $a); 

или со словом

 $a = preg_replace ("~^(.{1,${width}}\b)(.+)~", '\\1…', $a); 

это решение не будет сокращать слова, оно добавит три точки после первого пространства. Я отредактировал решение @ 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;