2013-06-01 29 views
8

Tôi đã đưa ra chức năng này cắt ngắn một chuỗi nhất định hoặc số lượng từ đã cho hoặc số ký tự nhất định ngắn hơn. Sau đó, sau khi tắt tất cả mọi thứ sau khi số lượng ký tự hoặc giới hạn từ, nó gắn thêm một '...' vào chuỗi.cắt ngắn chuỗi, nhưng loại bỏ giữa chuỗi thay vì kết thúc

Làm cách nào để xóa ký tự/từ ở giữa chuỗi và thay thế chúng bằng '...' thay vì thay thế các ký tự/từ ở cuối bằng '...'?

Đây là mã của tôi:

function truncate($input, $maxWords, $maxChars){ 
    $words = preg_split('/\s+/', $input); 
    $words = array_slice($words, 0, $maxWords); 
    $words = array_reverse($words); 

    $chars = 0; 
    $truncated = array(); 

    while(count($words) > 0) 
    { 
     $fragment = trim(array_pop($words)); 
     $chars += strlen($fragment); 

     if($chars > $maxChars){ 
      if(!$truncated){ 
       $truncated[]=substr($fragment, 0, $maxChars - $chars); 
      } 
      break; 
     } 

     $truncated[] = $fragment; 
    } 

    $result = implode($truncated, ' '); 

    return $result . ($input == $result ? '' : '...'); 
} 

Ví dụ nếu truncate('the quick brown fox jumps over the lazy dog', 8, 16); được gọi, 16 ký tự ngắn hơn do đó là cắt ngắn đó sẽ xảy ra. Vì vậy, 'con cáo nhảy qua con chó lười' sẽ bị xóa và '...' sẽ được thêm vào.

Nhưng, thay vào đó, làm thế nào tôi có thể có một nửa giới hạn ký tự đến từ đầu chuỗi và một nửa đến từ cuối chuỗi và những gì được xóa ở giữa thay thế bằng '...'? Vì vậy, chuỗi tôi đang tìm kiếm để trở lại trong này, một, trường hợp sẽ là: 'quic ... con chó lười biếng'.

Trả lời

21
$text = 'the quick brown fox jumps over the lazy dog'; 
$textLength = strlen($text); 
$maxChars = 16; 

$result = substr_replace($text, '...', $maxChars/2, $textLength-$maxChars); 

$ result bây giờ là:

the quic...lazy dog 
+1

+1 đơn giản và đẹp. – Orangepill

+3

Cần một 'if ($ textLength> $ maxChars)' – Petah

+1

Lưu ý rằng kết quả này trong một chuỗi có 19 ký tự mặc dù $ maxChars được đặt thành 16. – adean

0

Đây là những gì tôi đã kết thúc bằng:

/** 
* Removes characters from the middle of the string to ensure it is no more 
* than $maxLength characters long. 
* 
* Removed characters are replaced with "..." 
* 
* This method will give priority to the right-hand side of the string when 
* data is truncated. 
* 
* @param $string 
* @param $maxLength 
* @return string 
*/ 
function truncateMiddle($string, $maxLength) 
{ 
    // Early exit if no truncation necessary 
    if (strlen($string) <= $maxLength) return $string; 

    $numRightChars = ceil($maxLength/2); 
    $numLeftChars = floor($maxLength/2) - 3; // to accommodate the "..." 

    return sprintf("%s...%s", substr($string, 0, $numLeftChars), substr($string, 0 - $numRightChars)); 
} 

Đối với trường hợp sử dụng của tôi ở phía bên phải của chuỗi chứa thông tin hữu ích hơn thế nữa phương pháp này là thiên vị đối với việc đưa các ký tự ra khỏi nửa bên trái.

1

này sẽ không làm thay đổi đầu vào đó là ngắn hơn $maxChars, và mất độ dài của việc thay thế ... vào tài khoản:

function str_truncate_middle($text, $maxChars = 25, $filler = '...') 
{ 
    $length = strlen($text); 
    $fillerLength = strlen($filler); 

    return ($length > $maxChars) 
     ? substr_replace($text, $filler, ($maxChars - $fillerLength)/2, $length - $maxChars + $fillerLength) 
     : $text; 
} 
Các vấn đề liên quan