2010-07-01 9 views
254

Как я могу получить первые n символов строки в PHP? Каков самый быстрый способ обрезать строку до определенного количества символов и при необходимости добавить «...»?Получить первые n символов строки

+5

может быть лучше использовать символ с многоточием ... – Keet

+1

проверить мой ответ, если вам нужно избегать слов. – TechNyquist

+0

http://theunixshell.blogspot.in/2012/12/print-first-80-characters-in-line.html – Vijay

ответ

464
//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 символов следуют '...'

Update 2:

Или как функция:

function truncate($string, $length, $dots = "...") { 
    return (strlen($string) > $length) ? substr($string, 0, $length - strlen($dots)) . $dots : $string; 
} 

Update 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; 
} 
+0

Этот код добавляет три строки в строку, как я могу это исправить? – fello

+1

@fello $ string = (strlen ($ string)> 13)? substr ($ string, 0,13): $ string; –

+11

может быть лучше всего заменить на многоточие (...), а не на 3 точки (...) – Keet

2
if(strlen($text) > 10) 
    $text = substr($text,0,10) . "..."; 
4

Используйте подстроку

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

$foo = substr("abcde",0, 3) . "..."; 
+3

Этот код всегда будет добавлять ... в строку, которую он не хотел. – TravisO

+0

Вы абсолютно правы, и я соответствующим образом отредактировал ответ. (Пересмотренный ответ в настоящее время ожидает SO peer review) –

1

Лучше абстрагироваться вы» (обратите внимание, что предел является дополнительным и по умолчанию равен 10):

print limit($string); 


function limit($var, $limit=10) 
{ 
    if (strlen($var) > $limit) 
    { 
     return substr($string, 0, $limit) . '...'; 
    } 
    else 
    { 
     return $var; 
    } 
} 
+1

Это не сработает, потому что [trim()] (http://de3.php.net/manual/en/function.trim.php) уже существует. – Gordon

+0

Не могли бы объяснить, почему этот подход лучше, а не просто утверждать, что это так? – Robert

+1

@Robert это просто, и абстрагирование означает, что вам не нужно повторно вводить код снова и снова. И самое главное, если вы найдете лучший способ сделать это или хотите что-то более сложное, вы меняете только эту 1 функцию вместо 50 фрагментов кода. – TravisO

13

Расширение 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) . '...'; 
} 
+0
0

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

$str = 'someLongString'; 
$max = 7; 

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

WordWrap не будет обрезать строку вниз, просто разбить его ...

7

Структура 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; 
      }  
     } 
    } 
} 
1

функция Я:

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

увидеть его in action.

1

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

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);
он будет вырезать из вашей строки и добавить «...» в конце
:)

1

Это то, что я делаю

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

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

9

иногда вам нужно ограничить строку до последнего полного слова, то есть: вы не хотите, чтобы последнее слово было сломанным, вместо этого вы остановитесь со вторым последним словом.

например: мы должны ограничить «Это моя строка» до 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; 
    } 

} 
1

Чтобы создать внутри функции (для использования повторов) и динамической ограниченной длины, использование:

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, '..'); 
7

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

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.

1

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

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

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

0

$ ширина = 10;

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

или WordWrap

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

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

Эта функциональность была построена в PHP начиная с версии 4.0.6. See the docs.

echo mb_strimwidth('Hello World', 0, 10, '...'); 

// outputs Hello W... 

Обратите внимание, что trimmarker (выше многоточие) включены в усеченной длины.

+4

Работал идеально для меня. Ответ сверху не помог, и я рад, что этого не произошло, потому что продолжал прокручивать и нашел этот камень. – Eduardo

+0

Спасибо, я всегда использовал этот более длинный и старый метод! – gr3g

+1

Отлично, спасибо! Это должен быть лучший ответ! –