2009-06-09 4 views
55

Я задал аналогичный вопрос здесь раньше, но мне нужно знать, возможна ли эта небольшая настройка. Я хочу сократить строку до 100 символов и использовать для этого $small = substr($big, 0, 100);. Тем не менее, это просто занимает первые 100 символов и не волнует, сломает ли оно слово или нет.Получить первые 100 символов из строки, соблюдая полные слова

Есть ли способ перенести на первые 100 символов строки, но убедитесь, что вы не сломаете слово?

Пример:

$big = "This is a sentence that has more than 100 characters in it, and I want to return a string of only full words that is no more than 100 characters!" 

$small = some_function($big); 

$small = "This is a sentence that has more than 100 characters in it, and I want to return a string of only" 

Есть ли способ сделать это с помощью PHP?

+0

Попробуйте эту ссылку, может помочь вам ... http://stackoverflow.com/a/26098951/3944217 – edCoder

+0

Вы можете найти [ 's ($ НТР) -> truncateSafely (100)'] (https://github.com/delight-im/PHP-Str/blob/8fd0c608d5496d43adaa899642c1cce047e076dc/src/Str.php#L246) полезно, как показано в [этой автономной библиотеке] (https://github.com/delight- им/PHP-Str). Это, кстати, работает для Unicode (многобилетный). – caw

ответ

106

Все, что вам нужно сделать, это использовать:

$pos=strpos($content, ' ', 200); 
substr($content,0,$pos); 
+2

Легкий ветер! В конце концов включите его в функцию. Благодарю. Я добавлю остальную часть строки (для моих нужд!) $ Customer_name = substr ($ customer_name, 0, $ pos). "
" .substr ($ customer_name, $ pos, strlen ($ customer_name)); –

+3

Я получил 'strpos() [function.strpos]: смещение не содержалось в строке' почему? – Gediminas

+0

сохранено несколько часов .. – JayKandari

30

Да, есть. Это функция, которую я заимствовал у пользователя на разных форумах несколько лет назад, поэтому я не могу взять на себя ответственность за это.

//truncate a string only at a whitespace (by nogdog) 
function truncate($text, $length) { 
    $length = abs((int)$length); 
    if(strlen($text) > $length) { 
     $text = preg_replace("/^(.{1,$length})(\s.*|$)/s", '\\1...', $text); 
    } 
    return($text); 
} 

Обратите внимание, что он автоматически добавляет эллипсы, если вы не хотите, чтобы просто использовать '\\1' в качестве второго параметра для preg_replace вызова.

+2

Это просто чудесное решение. – Alordiel

+0

работает просто отлично –

+1

Это работает, за исключением того, что, когда первое слово длиннее $ length, возвращается целое слово. Поэтому, возможно, сначала положить '$ text = substr ($ text, 0, $ length)' first, чтобы он обрезался? – Niclas

20

Если вы определяете слова как «последовательности символов, разделенных пробелом» ... Используйте strrpos(), чтобы найти последнее пространство в строке, укоротите эту позицию, обрезайте результат.

+1

Я имею в виду, например, «последнее пространство в строке, начиная со смещения 100». – Tomalak

13

Конечно. Проще всего, наверное, написать обертку preg_match:

function limitString($string, $limit = 100) { 
    // Return early if the string is already shorter than the limit 
    if(strlen($string) < $limit) {return $string;} 

    $regex = "/(.{1,$limit})\b/"; 
    preg_match($regex, $string, $matches); 
    return $matches[1]; 
} 

EDIT: обновление не всегда включают в себя пространство в качестве последнего символа в строке

+0

этот никогда не работает для меня. Я использовал ту, которую предложил tj111 (заимствованный для nogdog). –

4

Это прекрасно работает для меня, я использую его в мой сценарий

<?PHP 
$big = "This is a sentence that has more than 100 characters in it, and I want to return a string of only full words that is no more than 100 characters!"; 
$small = some_function($big); 
echo $small; 

function some_function($string){ 
    $string = substr($string,0,100); 
    $string = substr($string,0,strrpos($string," ")); 
    return $string; 
} 
?> 

удачи

0

форматы WordWrap строки в соответствии с лимитом, seprates их с \ п , поэтому у нас есть линии меньше 50, орды не разделены. взрывает строку seprates в соответствии с \ n , поэтому у нас есть массив, соответствующий строкам . Список собирает первый элемент.

Список ($ short) = explode ("\ n", wordwrap ($ ali, 50));

, пожалуйста, сообщите Evert, так как я не могу ответить или отправить.

здесь пример запуска

php > $ali = "ali veli krbin yz doksan esikesiksld sjkas laksjald lksjd asldkjadlkajsdlakjlksjdlkaj aslkdj alkdjs akdljsalkdj "; 
php > list($short) = explode("\n",wordwrap($ali ,50)); 
php > var_dump($short); 
string(42) "ali veli krbin yz doksan esikesiksld sjkas" 
php > $ali =''; 
php > list($short) = explode("\n",wordwrap($ali ,50)); 
php > var_dump($short); 
string(0) "" 
9

Эта функция сокращает строку путем добавления "..." на границе слова каждый раз, когда это возможно. Возвращаемая строка будет иметь максимальную длину $len, включая "...".

function truncate($str, $len) { 
    $tail = max(0, $len-10); 
    $trunk = substr($str, 0, $tail); 
    $trunk .= strrev(preg_replace('~^..+?[\s,:]\b|^...~', '...', strrev(substr($str, $tail, $len-$tail)))); 
    return $trunk; 
} 

Примеры выходы:

  • truncate("Thanks for contributing an answer to Stack Overflow!", 15)
    возвращает "Thanks for..."
  • truncate("To learn more, see our tips on writing great answers.", 15)
    возвращает "To learn more..." (разделенные также усеченные)
  • truncate("Pseudopseudohypoparathyroidism", 15)
    возвращается "Pseudopseudo..."
4

Вот отличное решение с dotts в конце с полными словами

function text_cut($text, $length = 200, $dots = true) { 
    $text = trim(preg_replace('#[\s\n\r\t]{2,}#', ' ', $text)); 
    $text_temp = $text; 
    while (substr($text, $length, 1) != " ") { $length++; if ($length > strlen($text)) { break; } } 
    $text = substr($text, 0, $length); 
    return $text . (($dots == true && $text != '' && strlen($text_temp) > $length) ? '...' : ''); 
} 

Вход: Lorem Ipsum боль сидеть Амет, consectetur adipisicing Элит, СЭД сделать eiusmod TEMPOR incididunt ут Лаборе и др Dolore магна aliqua. Ut enim ad minim veniam, quis nostrud, осуществляющий работу, выполняемый в соответствии с потребностями. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat не имеет отношения к делу, sunt in culpa qui officia deserunt mollit anim id est laborum.

Выход: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tem incididunt ut labore et dolore magna aliqua. Ut enim объявление миним veniam, Quis nostrud ullamco Laboris упражнение НИСИ ут aliquip ...

2

Это сделал это для меня ...

//trim message to 100 characters, regardless of where it cuts off 
$msgTrimmed = mb_substr($var,0,100); 

//find the index of the last space in the trimmed message 
$lastSpace = strrpos($msgTrimmed, ' ', 0); 

//now trim the message at the last space so we don't cut it off in the middle of a word 
echo mb_substr($msgTrimmed,0,$lastSpace) 
2

Вот мое решение:

/** 
* get_words_until() Returns a string of delimited text parts up to a certain length 
* If the "words" are too long to limit, it just slices em up to the limit with an ellipsis "..." 
* 
* @param $paragraph - The text you want to Parse 
* @param $limit - The maximum character length, e.g. 160 chars for SMS 
* @param string $delimiter - Use ' ' for words and '. ' for sentences (abbreviation bug) :) 
* @param null $ellipsis - Use '...' or ' (more)' - Still respects character limit 
* 
* @return string 
*/ 
function get_words_until($paragraph, $limit, $delimiter = ' ', $ellipsis = null) 
{ 
    $parts = explode($delimiter, $paragraph); 

    $preview = ""; 

    if ($ellipsis) { 
     $limit = $limit - strlen($ellipsis); 
    } 

    foreach ($parts as $part) { 
     $to_add = $part . $delimiter; 
     if (strlen($preview . trim($to_add)) <= $limit) { // Can the part fit? 
      $preview .= $to_add; 
      continue; 
     } 
     if (!strlen($preview)) { // Is preview blank? 
      $preview = substr($part, 0, $limit - 3) . '...'; // Forced ellipsis 
      break; 
     } 
    } 

    return trim($preview) . $ellipsis; 
} 

В вашем случае это будет (пример):

$big = "This is a sentence that has more than 100 characters in it, and I want to return a string of only full words that is no more than 100 characters!" 

$small = get_words_until($big, 100); 
1

Я извиняюсь за воскресить этот вопрос, но я наткнулся на эту тему и foun d небольшая проблема. Для тех, кто хочет лимит персонажа, который удалит слова, которые будут превышать ваш лимит, приведенные выше ответы отлично работают. В моем конкретном случае мне нравится показывать слово, если предел падает посреди слова. Я решил поделиться своим решением, если кто-то еще ищет эту функциональность и должен включать слова вместо их обрезки.

function str_limit($str, $len = 100, $end = '...') 
{ 
    if(strlen($str) < $len) 
    { 
     return $str; 
    } 

    $str = preg_replace("/\s+/", ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str)); 

    if(strlen($str) <= $len) 
    { 
     return $str; 
    } 

    $out = ''; 
    foreach(explode(' ', trim($str)) as $val) 
    { 
     $out .= $val . ' '; 

     if(strlen($out) >= $len) 
     { 
      $out = trim($out); 
      return (strlen($out) == strlen($str)) ? $out : $out . $end; 
     } 
    } 
} 

Примеры:

  • Входной сигнал: echo str_limit('Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.', 100, '...');
  • Выход: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore...
  • Входной сигнал: echo str_limit('Lorem ipsum', 100, '...');
  • Выход: Lorem ipsum
  • Входной сигнал: echo str_limit('Lorem ipsum', 1, '...');
  • Выход: Lorem...
1

Вот еще один способ, которым вы можете это сделать.

$big = "This is a sentence that has more than 100 characters in it, and I want to return a string of only full words that is no more than 100 characters!" 
$big = trim($big); 
$small = $big; 
       if(strlen($big) > 100){ 
       $small = mb_substr($small, 0, 100); 
       $last_position = mb_strripos($small, ' '); 
        if($last_position > 0){ 
        $small = mb_substr($small, 0, $last_position); 
        } 
       } 

      echo $small; 

ИЛИ

echo (strlen($small) < strlen($big) ? $small.'...' : $small); 

Это также многобайтовая безопасным, а также работает, даже если нет пространства, в этом случае он будет просто возвращать первые 100 символов. Он принимает первые 100 символов, а затем выполняет поиск с конца до ближайшего разделителя слов.

2
function truncate ($str, $length) { 
    if (strlen($str) > $length) { 
     $str = substr($str, 0, $length+1); 
     $pos = strrpos($str, ' '); 
     $str = substr($str, 0, ($pos > 0)? $pos : $length); 
    } 
    return $str; 
} 

Пример:

print truncate('The first step to eternal life is you have to die.', 25); 

строка (25) "Первый шаг к вечной"

print truncate('The first step to eternal life is you have to die.', 12); 

строки (9) "Первый"

print truncate('FirstStepToEternalLife', 5); 

строка (5) «Первый»

1

Проблема с общепринятым ответом является то, что результирующая строка выходит за предел, то он может превышать 100 символов, так как strpos будет выглядеть после в смещение, и поэтому ваша длина всегда будет превышать ваш лимит. Если последнее слово длинное, например squirreled, тогда длина вашего результата будет 111 (чтобы дать вам представление).

Лучшим решением является использование wordwrap функции:

function truncate($str, $length = 125, $append = '...') { 
    if (strlen($str) > $length) { 
     $delim = "~\n~"; 
     $str = substr($str, 0, strpos(wordwrap($str, $length, $delim), $delim)) . $append; 
    } 

    return $str; 
} 


echo truncate("The quick brown fox jumped over the lazy dog.", 5); 

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

P.S. Это особенно полезно, если вы планируете хранить укороченную строку в своей базе данных с фиксированной колонкой типа VARCHAR (50) и т. Д.

P.P.S. Обратите внимание на специальный разделитель в wordwrap. Это необходимо, чтобы ваша строка была усечена правильно, даже если она содержит символы новой строки (в противном случае она будет усекаться при первой новой строке, которую вы не хотите).

6

Это мой подход, основанный на ответе амира, но он не позволяет ни одному слову сделать строку длиннее предела, используя strrpos() с отрицательным смещением.

Простой, но работает. Я использую тот же синтаксис, что и в вспомогательной функции str_limit() Laravel, в случае, если вы хотите использовать его в проекте, отличном от Laravel.

function str_limit($value, $limit = 100, $end = '...') 
{ 
    $limit = $limit - mb_strlen($end); // Take into account $end string into the limit 
    $valuelen = mb_strlen($value); 
    return $limit < $valuelen ? mb_substr($value, 0, mb_strrpos($value, ' ', $limit - $valuelen)) . $end : $value; 
} 
+2

Да, я согласен, что это лучше, чем ответ Амира, поскольку он соблюдает точный предел. Но для дальнейшего улучшения ответа вы можете использовать многобайтовые функции символов «mb_» для поддержки многобайтовых символов, таких как символы арабского языка. Поскольку ваша функция будет терпеть неудачу, если вы использовали многобайтовые символы в тестовой строке. Используйте «mb_strlen(), mb_substr(), mb_strpos» вместо «strlen(), substr(), strrpos()» /. –

+0

ОК, сделано .... :) – OMA

0

Еще один ответ! Я не был полностью доволен другими ответами и хотел «жесткого отсечения» (гарантированный разрыв слов до $ max_characters, если это возможно), поэтому вот моя функция внести свой вклад!

/** 
* Shortens a string (if necessary), trying for a non-word character before character limit, adds an ellipsis and 
* returns. Falls back to a forced cut if no non-word characters exist before. 
* 
* @param string $content 
* @param int $max_characters - number of characters to start looking for a space/break. 
* @param bool $add_ellipsis - add ellipsis if content is shortened 
* 
* @return string 
*/ 
public static function shorten($content, $max_characters = 100, $add_ellipsis = TRUE) { 
    if (strlen($content) <= $max_characters) { 
     return $content; 
    } 

    // search for non-word characters 
    $match_count = preg_match_all('/\W/', $content, $matches, PREG_OFFSET_CAPTURE); 

    // force a hard break if can't find another good solution 
    $pos = $max_characters; 

    if ($match_count > 0) { 
     foreach ($matches[0] as $match) { 
      // check if new position fits within 
      if ($match[1] <= $max_characters) { 
       $pos = $match[1]; 
      } else { 
       break; 
      } 
     } 
    } 

    $suffix = ($add_ellipsis) ? '&hellip;' : ''; 

    return substr($content, 0, $pos) . $suffix; 
} 
0

## Получить первый ограниченный характер из строки ##

<?php 
    $content= $row->title; 
    $result = substr($content, 0, 70); 
    echo $result; 
    ?>