2011-07-06 116 views
4

我有一個顯示多個文本條目的網頁,這些條目的長度沒有限制。如果它們太長以至於無法避開新線路,它們會自動切斷。這是削減它們的PHP函數:用算法縮短語句的問題

function cutSentence($sentence, $maxlen = 16) { 
    $result = trim(substr($sentence, 0, $maxlen)); 

    $resultarr = array(
      'result' => $result, 
      'islong' => (strlen($sentence) > $maxlen) ? true : false  
     ); 

    return $resultarr; 
} 

正如您在下圖中看到的,結果很好,但有一些例外。一個包含多個Ms的字符串(我必須考慮這些)將進入一個換行符。

現在所有的字符串都會在16個字符後被切斷,而這個字符已經非常低,並且很難讀取。

我想知道是否存在一種方法來確保值得擁有更多空間的句子得到它,而那些包含寬字符的句子最終會被削減爲較少的字符數(請勿建議使用CSS屬性文本-overflow:省略號,因爲它沒有得到廣泛的支持,它不允許我使「...」點擊能夠鏈接到完整的條目,並且我不惜一切代價需要這個)。

在此先感謝。

+0

你在做什麼並不是最佳實踐...... PHP不知道UI的任何內容以及它是如何設計的,這就是爲什麼它不能計算最佳文本寬度......使用CSS/Javascript。添加「查看更多」鏈接是另一個與您的問題無關的故事。 –

+0

另請注意,您似乎正在處理UTF-8代碼,並且沒有任何適當的位置來避免在中間代碼點中切斷字符串。實際上,想一想:通過結合字符,這樣的任務在一般意義上肯定是不平凡的。 –

回答

1

如果您的應用程序的風格不是太重要,那麼您可以簡單地在等寬系列中使用字體,例如Courier。

+0

由於OP正在經歷所有麻煩以正確對齊事物,因此我'那種猜測那種風格*很重要... –

3

您可以使用固定寬度的字體,以便所有字符的寬度均相等。或者可以選擇得到每個字符有多少像素,並將它們加在一起,並刪除附加字符,而不是像素長度超過一定量。

+0

你的第二個選擇是有問題的。瀏覽器之間有區別,它可能會導致錯誤。 –

+0

@Garbriele:這就是**正是**你不應該試圖在服務器端做這件事的原因:你要麼*過份關注*(即在許多情況下切斷多於必要)或與事實上,一些文本仍然會溢出。 –

+0

我最終發現使用等寬字體是最好的解決方案。由於這個頁面必須與舊瀏覽器完全兼容,並且javascript已禁用,所以我將使用等寬字體作爲後備,並使用jQuery替換它(如果可用) –

1

用Javascript而不是用PHP來做。使用DOM屬性offsetWidth來獲取包含元素的寬度。如果超過某個最大寬度,則相應地截斷。

代碼從How can I mimic text-overflow: ellipsis in Firefox?複製:

function addOverflowEllipsis(containerElement, maxWidth) 
{ 
    var contents = containerElement.innerHTML; 
    var pixelWidth = containerElement.offsetWidth; 
    if(pixelWidth > maxWidth) 
    { 
     contents = contents + "…"; // ellipsis character, not "..." but "…" 
    } 
    while(pixelWidth > maxWidth) 
    { 
     contents = contents.substring(0,(contents.length - 2)) + "…"; 
     containerElement.innerHTML = contents; 
     pixelWidth = containerElement.offsetWidth; 
    } 
} 
+0

我只能使用PHP,對不起。 –

+0

你有特定的原因爲什麼?考慮到手頭的任務和可用的技術,這似乎是一個奇怪的限制。 – tskuzzy

+0

這是因爲這個網站將被許多客戶使用,而且很有可能運行舊瀏覽器或禁用JavaScript。 –

-2

因爲你所要求的網頁,那麼你可以使用CSS文本溢出來做到這一點。 這似乎是足夠的支持,併爲Firefox似乎有css workaroundsjquery workarounds ...

事情是這樣的:

span.ellipsis { 
    white-space:nowrap; 
    text-overflow:ellipsis; 
    overflow:hidden; 
    width:100%; 
    display:block; 
} 

如果您填寫更多的文字比它符合這將增加三個點最後。 只要剪切文本,如果它真的太長,所以你不會浪費html空間。

此處瞭解詳情:

https://developer.mozilla.org/En/CSS/Text-overflow

添加在最後一個「看到更多」鏈接是很容易的,因爲附加固定寬度的另一跨度,包含鏈接看多。在此之前,文本將被省略號截斷。

+0

對不起,在我指定的問題中,我無法使用該方法,也無法使用JavaScript解決方法。 –

+0

對不起,你必須反駁黑客:) –