剪短字符串PHP

时间:2009-08-11 18:41:46

标签: php string

如何将字符串缩短以便它不会转到div标签的下一行例如我的message字符串包含以下内容:

  

我们更喜欢可以回答的问题,而不仅仅是讨论过。提供细节。写得清楚简单。如果您的问题与本网站有关,请在meta上询问。

我希望最好将其显示为

  

我们更喜欢可以回答的问题,而不仅仅是讨论过。提供...阅读更多

我想用PHP来缩短字符串,但是你有以下问题

  

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ...阅读更多

您可以看到上面的字符串仍然可以扩展一点。任何方式做到这一点或不做,谢谢你提前

11 个答案:

答案 0 :(得分:4)

如何缩短字符串已经得到解答,但您的主要问题是:

如何切割字符串短所以它不会转到div标签的下一行

这在大多数情况下都不起作用。

例如:

IIIIIIIIII

wwwwwwwwww

你看到了问题吗?

这只适用于你的字符宽度相同的情况:

iiiiiiiiii
wwwwwwwwww

答案 1 :(得分:4)

使用PHP,您可以使用wordwrap函数执行截断:

function truncate_to_length($text, $length, $text_if_longer = "...") 
{
    if (strlen($text) > $length) 
    {
        $text = wordwrap($text, $length);
        $text = substr($text, 0, strpos($text, "\n"));
        return $text . $text_if_longer;
    }
    return $text;
}

答案 2 :(得分:1)

检查尺寸,如果尺寸大于最大尺寸,请取最左边的字符。

最左边#=总大小 - 大小(“...阅读更多”)。 然后将读取更多地附加到最左边的字符。

雅各

答案 3 :(得分:1)

以下是http://snippetdb.com/php/truncate-string

的示例
function Truncate ($str, $length=10, $trailing='...')  
{ 
      // take off chars for the trailing 
      $length-=strlen($trailing); 
      if (strlen($str) > $length)  
      { 
         // string exceeded length, truncate and add trailing dots 
         return substr($str,0,$length).$trailing; 
      }  
      else  
      {  
         // string was already short enough, return the string 
         $res = $str;  
      } 

      return $res; 
} 

答案 4 :(得分:1)

Oooo我想出了一些有效但不完全有用的东西...我想分享

div.string{

    height:15px;        
    overflow:hidden;
}

它解决了它将隐藏整个单词的问题,因为溢出和高度仅设置为一行。然而,上述仍然是Rufinus所显示的问题:

  

iiiiiiiiiiiiii

     

wwwwwwwwwwwwww

答案 5 :(得分:1)

以下主要是有效的;主要问题是“...阅读更多”通知可以掩盖部分信件。它还使用了一堆表示元素,需要JS。这让我觉得不洁净。

最外层元素(类.string)用于设置整体大小。 .text保存要显示的文本。后代层次结构中的.string和.text之间是宽度较大的元素。这将.text中的所有文本放在一行上。 JS用于显示或隐藏“...阅读更多”通知。

<style type="text/css">
  .string {
    height: 1em;
    width: 25%;
    position: relative; /* create containing block for children */
    border: 1px solid black;
    overflow: hidden;
    background: white; /* or whatever, as long as it's not "transparent". */
  }
  .string .line {
    width: 5000px; /* long enough for you? */
  }
  .string .notice {
    position: absolute;
    top: 0;
    right: 0;
    z-index: 1;
    display: none;
    background: inherit; /* so that the notice will completely cover up whatever's beneath */
  }
</style>

<div class="string">
  <div class="line"><span class="text">We prefer questions that can be answered, 
    not just discussed. Provide details. Write clearly and simply. If your 
    question is about this website, ask it on meta instead.</span></div>
</div>
<hr />
<div class="string">
  <div class="line"><span class="text">Lorem ipsum dolor sit amet.</span></div>
</div>

<script>
  function isOverflowed(elt) {
      return elt.offsetWidth > elt.parentNode.parentNode.clientWidth;
  }
  function getNotice(textElt) {
       try {
           return (textElt.parentNode.parentNode.getElementsByClassName('notice'))[0];
       } catch (e) {
           return {style: {}};
       }
  }
  function show(elt) {
      elt.style.display = 'block';
  }
  function hide(elt) {
      elt.style.display = 'none';
  }
  function showReadMoreNotices() {
    var text=document.getElementsByClassName('text');
    for (var i=0; i<text.length; ++i) {
      if (isOverflowed(text[i])) {
          show(getNotice(text[i]));
      } else {
          hide(getNotice(text[i]));
      }
    }
  }

  var strings = document.getElementsByClassName('string');
  var notice = document.createElement('div');
  notice.appendChild(document.createTextNode('\u2026Read more'));
  notice.className = 'notice';
  for (var i=0; i<strings.length; ++i) {
      strings[i].appendChild(notice.cloneNode(true));
  }

  showReadMoreNotices();
  /* use your favorite event registration method here. Not that the traditional 
   * model is my favorite, it's just simple.
   */
  window.onresize = showReadMoreNotices;
</script>

答案 6 :(得分:1)

这是一个从智能模板中挑选出来的功能,它可以在不削减字符串的情况下缩短字符串。

function str_short($string, $length = 80, $etc = '...',
                              $break_words = false, $middle = false)
{
if ($length == 0)
    return '';

if (strlen($string) > $length) {
    $length -= min($length, strlen($etc));
    if (!$break_words && !$middle) {
        $string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length+1));
    }
    if(!$middle) {
        return substr($string, 0, $length) . $etc;
    } else {
        return substr($string, 0, $length/2) . $etc . substr($string, -$length/2);
    }
} else {
    return $string;
}

}

答案 7 :(得分:0)

这一切都取决于字体。当然,您可以使用等宽字体,但这不是解决方案。无论如何,你为什么要这样做?即使您设法使其适用于某种字体,也可能是用户没有它。然后会使用不同的字体,一切都可能会破坏......

答案 8 :(得分:0)

使用非等宽字体在PHP中基本上不可能这样做(即使使用等宽字体,很难准确判断字符串在某个浏览器中的长度。我能想到的唯一方法在浏览器中执行此操作是将其放入a并将span的宽度设置为某个宽度,然后使用overflow:hidden。

答案 9 :(得分:0)

如果您知道浏览器使用的真实字体,可以使用GD库中的imagettfbbox()来计算文本的宽度。然后迭代并删除文本末尾的字符,直到它适合您的div。

这可能不是非常有效,我知道,但它确实起作用。您可以针对特定解决方案进行微调和优化。

<?
    $width = 280;   // max. width in pixels that the text should have
    $font = 'C:\Windows\Fonts\verdana.TTF';
    $text = 'The quick brown fox jumps over the lazy dog';

    function getWidth($text) {
        list($x1, , $x2) = imagettfbbox(12, 0, $font, $text);
        return $x2-$x1;
    }

    while (getWidth($text.'...') > $width) $text = substr($text, 0, -1);
?>

<style type='text/css'>
    #my_div {
        font-family: Verdana; 
        font-size: 12pt; 
        border: 1px solid black; 
        width: 280px; 
        padding: 0
    }
</style>

<div id='my_div'>
    <?=$text?>...
</div>

答案 10 :(得分:0)

根据您使用的浏览器,这一行CSS可以解决问题:

div.string {
    word-wrap: break-word;
}