Как я могу получить первые 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 содержит помощник для этого, называемый «текстовый помощник». Вот некоторая документация из руководства пользователя 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