2017-06-17 22 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 
     } 

    } 
}