2017-06-17 56 views
0

我試圖讓Facebook的show more行爲起作用。 我希望它修剪字符串,如果:類似Facebook的「顯示更多」按鈕,用於帶有網址的字符串

  • 其長度超過200個字符。
  • 有5個以上/n發生。

這聽起來很簡單,我已經有一個初步的功能(僅按長度這樣做,我還沒有實現的/n事件尚未):

function contentShowMore($string, $max_length) { 
    if(mb_strlen($string, 'utf-8') <= $max_length) { 
     return $string; // return the original string if haven't passed $max_length 
    } else { 
     $teaser = mb_substr($string, 0, $max_length); // trim to max length 
     $dots = '<span class="show-more-dots"> ...</span>'; // add dots 
     $show_more_content = mb_substr($string, $max_length); // get the hidden content 
     $show_more_wrapper = '<span class="show-more-content">'.$show_more_content.'</span>'; // wrap it 

     return $teaser.$dots.$show_more_wrapper; // connect all together for usage on HTML. 
    } 
} 

的問題是,該字符串可能包括網址,所以它打破了它們。我需要找到一種方法來製作功能show-more按鈕,它可以檢查長度,換行符並且不會切斷網址。

謝謝!

實施例:

輸入:contentShowMore("hello there http://google.com/ good day!", 20)

輸出:

hello there http://g 
<span class="show-more-dots"> ...</span> 
<span class="show-more-content">oogle.com/ good day!</span> 

輸出我想:

hello there http://google.com/ 
<span class="show-more-dots"> ...</span> 
<span class="show-more-content"> good day!</span> 
+0

你能分享你的意見和期望的結果嗎? –

+0

沒有特定的輸入和輸出,因爲此功能將運行很多。但我可以舉一個例子。我會將其添加到我的問題,堅持 –

+0

我可以問你是否傳遞第二個參數爲'20',以及你如何得到它,我會幫助你,爲了更好的理解我只想了解你的問題。 –

回答

0

找到了解決辦法!

function contentShowMore($string, $max_length, $max_newlines) { 

    $trim_str = trim($string); 

    if(mb_strlen($trim_str, 'utf-8') <= $max_length && substr_count($trim_str, "\n") < $max_newlines) { // return the original if short, or less than X newlines 
     return $trim_str; 
    } else { 
     $teaser = mb_substr($trim_str, 0, $max_length); // text to show 
     $show_more_content = mb_substr($trim_str, $max_length); 

     // the read more might have cut a string (or worse - an URL) in the middle of it. 
     // so we will take all the rest of the string before the next whitespace and will add it back to the teaser. 
     $content_parts = explode(' ', $show_more_content, 2); // [0] - before first space, [1] - after first space 
     $teaser .= $content_parts[0]; 

     if(isset($content_parts[1])) { // if there are still leftover strings, its on show more! :) 
      $show_more_content = $content_parts[1]; 
     } 

     // NOW WERE CHEKING MAX NEWLINES. 
     $teaser_parts = explode("\n", $teaser); // break to array. 
     $teaser = implode("\n", array_slice($teaser_parts, 0, $max_newlines)); // take the first $max_newlines lines and use them as teaser. 
     $show_more_content = implode("\n", array_slice($teaser_parts, $max_newlines)) . ' ' . $show_more_content; // connect the rest to the hidden content. 

     if(mb_strlen($show_more_content, "UTF-8") === 0) { 
      return $trim_str; // nothing to hide - return original. 
     } else { 
      $show_more_wrapper = '<span class="show-more-content">'.$show_more_content.'</span>'; 

      $dots = '<span class="show-more-dots"> ...</span>'; // dots will be visible between the teaser and the hidden. 
      $button = ' <span class="show-more">Show more</span>'; 

      return $teaser.$dots.$button.$show_more_wrapper; // connect ingredients 
     } 

    } 
}