2012-01-25 126 views
1

我想建立一個函數來修剪一個字符串,它是根據我的規格太長。php修剪一個字符串

這是我有:

function trim_me($s,$max) 
{ 
    if (strlen($s) > $max) 
    { 
     $s = substr($s, 0, $max - 3) . '...'; 
    } 
    return $s; 
} 

以上將削減一個字符串,如果它比$max長,將添加一個延續...

我想展開函數來處理多個單詞。目前它做它做的,但如果我有一個字符串說:How are you today?這是18個字符長。如果我運行trim_me($s,10)它會顯示爲How are yo...,這不美觀。我怎麼能做到這一點,所以它在整個單詞後面增加了一個...。說如果我運行trim_me($s,10)我希望它顯示How are you...添加該單詞後的延續。有任何想法嗎?

我幾乎不想在一個詞的中間添加延續。但是如果字符串只有一個單詞,那麼連續只能打破這個單詞。

+0

可能重複[如何截斷PHP中的字符串?](http://stackoverflow.com/questions/965235/how-can-i-truncate-a-string-in-php) – Stephen

+0

因此'trim_me ('a bbbbbbbbbbbbbbbbbbbbbbbb c',10)''會是''a bbbbbbbbbbbbbbbbbbbbbbbb ...''? – ruakh

+0

我得到'string(10)「如何...」'trim_me($ s,10) –

回答

0
function trim_me($s,$max) { 
    if(strlen($s) <= $max) return $s; 
    return substr($s,0,strrpos($s," ",$max-3))."..."; 
} 

strrpos是做魔術的功能。

+0

您從哪裏獲得'$ c'? – user962449

+0

該函數被稱爲'trim_me',你有一個未定義的'$ c',我認爲在if後沒有括號的情況下在行尾有一個返回是不好的做法。通常使用if和else是首選,因爲它使您的邏輯清晰並允許擴展。 –

+0

我可以怪我的鍵盤嗎?或者我的疲倦? :p –

0

所以,這裏是你想要什麼:

<?php 
// Original PHP code by Chirp Internet: www.chirp.com.au 
// Please acknowledge use of this code by including this header. 
function myTruncate($string, $limit, $break=".", $pad="...") { 
    // is $break present between $limit and the end of the string? 
    if(false !== ($breakpoint = strpos($string, $break, $limit))) { 
     if($breakpoint < strlen($string) - 1) { 
      $string = substr($string, 0, $breakpoint) . $pad; 
     } 
    } 
    return $string; 
} 
?> 

此外,您還可以閱讀更多的http://www.the-art-of-web.com/php/truncate/

0

我命名功能str_trunc。你可以指定strict爲TRUE,在這種情況下,它只允許一個最大大小的字符串,不會再有更多的字符串,否則它會搜索它即將完成的單詞中最短的字符串。

var_dump(str_trunc('How are you today?', 10)); // string(10) "How are..." 
var_dump(str_trunc('How are you today? ', 10, FALSE)); // string(14) "How are you..." 

// Returns a trunctated version of $str up to $max chars, excluding $trunc. 
// $strict = FALSE will allow longer strings to fit the last word. 
function str_trunc($str, $max, $strict = TRUE, $trunc = '...') { 
    if (strlen($str) <= $max) { 
     return $str; 
    } else { 
     if ($strict) { 
      return substr($str, 0, strrposlimit($str, ' ', 0, $max + 1)) . $trunc; 
     } else { 
      return substr($str, 0, strpos($str, ' ', $max)) . $trunc; 
     } 
    } 
} 

// Works like strrpos, but allows a limit 
function strrposlimit($haystack, $needle, $offset = 0, $limit = NULL) { 
    if ($limit === NULL) { 
     return strrpos($haystack, $needle, $offset); 
    } else { 
     $search = substr($haystack, $offset, $limit); 
     return strrpos($search, $needle, 0); 
    } 
} 
0

這其實在某種程度上簡單,我添加這個答案,因爲the suggested duplicate不符合您的需求(但它確實給一些指點)。

你想要的是剪切一個字符串的最大長度,但保留最後一個字。所以你需要找出剪切字符串的位置(如果真的有必要剪切它)。

隨着越來越長度(strlen)和切割字符串(substr)是不是你的問題(你已經在使用它),要解決的問題是如何獲得的最後一個字的位置,也就是說,在限制範圍內。

這涉及到分析字符串並找出每個單詞的偏移量。字符串處理可以用正則表達式來完成。在寫這一點,讓我想起了一些其實更多類似的問題在那裏這已經被解決:

它正是這樣做的:使用正則表達式獲取「全字」字符串。唯一的區別是,它刪除了最後一個單詞(而不是擴展它)。如果您想擴展最後一個單詞,則需要使用不同的正則表達式模式。

在正則表達式中\b匹配單詞邊界。那是在一個詞之前或之後。您現在要選取至少$length個字符,直到下一個單詞邊界。

由於這可能在下一個單詞之前包含空格,所以您可能需要修剪結果以在最後刪除這些空格。

你可以擴展你的函數一樣,然後用正則表達式模式(preg_replace)和trim如下:

/** 
* Cut a string at length while preserving the last word. 
* 
* @param string $str 
* @param int $length 
* @param string $suffix (optional) 
*/ 
function trim_word($str, $length, $suffix = '...') 
{ 
    $len = strlen($str); 

    if ($len < $length) return $str; 

    $pattern = sprintf('/^(.{%d,}?)\b.*$/', $length); 
    $str = preg_replace($pattern, '$1', $str); 
    $str = trim($str); 
    $str .= $suffix; 

    return $str; 
} 

用法:

$str = 'How are you today?'; 
echo trim_word($str, 10); # How are you... 

您可以進一步通過減少擴展這個模式中的最小長度由後綴的長度決定(因爲它在您的問題中以某種方式建議,但是您在問題中給出的結果與您的代碼不匹配)。

我希望這是有幫助的。同時請使用本網站上的搜索功能,但這並不完美,但許多寶石隱藏在現有的替代方法的問題中。