2009-08-11 28 views
2

你怎麼會去切串短,所以它不進入下一行的div標籤比如我message字符串包含以下內容:切串短PHP

我們更希望可以回答問題,不只是討論。提供細節。寫清楚,簡單。如果你的問題是關於這個網站的,請在meta上提問。

,我想最好將其顯示爲

我們更希望能得到解答,而不僅僅是討論的問題。提供...更多

即時通訊思想切割短字符串使用PHP,但那麼你有以下的問題

!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ...閱讀更多

你可以看到上面的字符串仍然可以擴展多一點。任何方式做到這一點與否,在此先感謝

+0

「[...]所以它不進入下一行[...]」 - 要做到這一點,你需要知道怎麼行「長」是如何廣泛的文本會被顯示。這對PHP來說很困難。 – Gumbo 2009-08-11 18:48:34

+0

是的,我認爲。 – 2009-08-11 18:49:58

+0

您是否想過使用JavaScript來做到這一點? – Gumbo 2009-08-11 19:01:46

回答

1

以下主要工作;主要問題是「...更多」通知可以掩蓋部分信件。它也使用一些表示元素,並要求JS。這讓我感到不潔。

最外面的元素(類.string)用於設置整體大小。 .text保存要顯示的文本。後代層次結構中的.string和.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> 
+0

我現在跑了,但我回來,並測試您的代碼:D – 2009-08-13 11:49:15

+0

我第一次發佈的代碼不適合發佈;創建通知元素的部分缺失。現在已經修復了。 – outis 2009-08-13 12:17:12

1

檢查大小,如果大小大於你的最大更大,走最左邊的字符。

最左邊#=總大小 - 大小( 「...閱讀更多」)。 然後將閱讀更多附加到最左邊的字符。

雅各

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

你怎麼可以縮短字符串已經回答了,但你的主要問題:

你怎麼會去切割字符串短所以它不會去div標記中的下一行

這將無法正常工作 在多數情況下。

例如:

IIIIIIIIII

wwwwwwwwww

你看這個問題?

這只是工作,如果你的字符有這樣相同的寬度:

iiiiiiiiii 
wwwwwwwwww 
0

這一切都取決於字體。當然,你可以使用等寬字體,但這不是一個解決方案。無論如何,你爲什麼要這樣做?即使你設法使它在某種字體上工作,也可能是用戶沒有它。然後,一個不同的字體將被使用,並且一切都可能打破...

+0

這個問題更基於,可以做到:D – 2009-08-11 18:59:33

0

這將是基本上不可能與非等寬字體(即使是等寬字體要做到這一點在PHP中,這是很難說究竟有多長將要在某個瀏覽器中的字符串。我能想到在瀏覽器中這樣做的唯一方法是將其放在a中,並將span的寬度設置爲某個寬度,然後使用overflow:hidden。

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; 
} 
1

嗚,我想出了一些工作,但沒有工作完全... ID喜歡分享

div.string{ 

    height:15px;   
    overflow:hidden; 
} 

它解決了這個問題,它會隱藏不適合行結束的整個單詞..,因爲溢出並且高度僅設置爲一行。然而上述仍然dosent做由Rufinus所示的問題:

iiiiiiiiiiiiii

wwwwwwwwwwwwww

+1

+1這是我的首選方法。永遠不要限制你的服務器端變量的客戶端問題,特別是可能隨時間而改變的問題:) – 2009-08-11 18:56:25

+1

將高度改爲「1em」,你會得到+1。 – outis 2009-08-11 20:23:01

+0

oo謝謝我想知道是否有這樣的事情:D – 2009-08-13 11:47:23

0

如果你知道什麼是真正的類型字體的瀏覽器使用,可以使用在該imagettfbbox() GD庫來計算文本的寬度。然後迭代並刪除文字結尾的字符,直到它適合您的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> 
+0

我不會推薦一個圖像來限制文本寬度。我建議優雅的CSS! – 2009-08-11 20:30:14

0

根據您所使用的瀏覽器,CSS的這一行可以做的伎倆:

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

那沒有爲我工作 – 2009-08-13 11:45:30

1

這是一個從smarty模板中選取的函數,它可以在不切割字符串的情況下縮短字符串。

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; 
} 

}