2011-07-06 14 views
4

長さに制限のない複数のテキストエントリを表示するWebページがあります。彼らは新しい行に行かないように長すぎる場合、自動的にカットされます。これは、それらをカットするPHP関数です:文章を短くするアルゴリズムの問​​題

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

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

    return $resultarr; 
} 

あなたは下の画像で見ることができるように、結果は罰金ですが、いくつかの例外があります。複数のMを含む文字列(それらを考慮する必要があります)は改行に移動します。

現在、すべての文字列はわずか16文字で切り詰められていますが、これは既に非常に低く、読みにくくなっています。

もっとスペースを必要とする文章を取得する方法と、ワイド文字を含む文章をより少ない文字数で終わるようにする方法があるかどうかを知りたいのですが(CSSプロパティテキスト-overflow:一般的にサポートされていないため、省略記号がついているので、「...」をクリックして完全なエントリにリンクすることはできません。

ありがとうございます。

+0

あなたがやっていることはベストプラクティスではありません... PHPはUIとそれがどのようにスタイル化されているかについて何も知らないので、最高のテキスト幅を計算できません... CSS/Javascriptを使用してください。あなたの質問とは無関係の別の話です。 –

+0

また、UTF-8コードを扱っているように見えますが、コードポイントの中間で文字列を切り取らないようにするために何もしていないことに注意してください。実際には、考えてみましょう:文字を組み合わせることで、そのような仕事は一般的な意味ではっきりと*自明ではありません。 –

答えて

1

アプリケーションのスタイルがあまり重要でない場合は、Courierなどのモノスペースファミリーのフォントを使用するだけです。

+0

OPが問題を完全に解決するので、スタイル*が重要であることを推測しています。 –

3

すべての文字の幅が同じになるように固定幅フォントを使用できます。または、任意に1文字ごとにいくつのピクセル幅を取得し、それらを一緒に追加して、ピクセル長が一定量を超えないように追加文字を削除することもできます。

+0

2番目のオプションは問題があります。ブラウザ間に違いがあり、エラーにつながる可能性があります。 –

+0

@Garbriele:それは**まさに**サーバ側でそれをやろうとしてはいけない理由です:あなたは過酷な*(多くの場合、必要以上に切り詰める)か、実際には一部のテキストはまだオーバーフローします。 –

+0

モノスペースフォントを使用するのが最適な解決方法であることが分かりました。このページは古いブラウザとjavascriptが完全に機能しないので、モノスペースフォントをフォールバックとして使用し、利用可能であればjQueryを使用して置き換えます。 –

1

PHPではなくJavascriptで行います。 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のテキストのオーバーフローを使用することができ、Webページを求めているので。あなたはそれが3つのドットが追加されます収まるよりも多くのテキストを記入した場合は

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

: このような何か

十分にサポートされているようだ、とFirefox用css workaroundsまたはjquery workaroundsがあるように思われる...

最後に。 HTMLのスペースを無駄にしないように、テキストが長すぎる場合は、テキストをカットしてください。ここ

さらに詳しい情報:最後に「もっと見る」リンクを追加

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

は、固定幅を持つ別のスパンを追加する詳細を参照するためのリンクを含むよう、十分に簡単です。テキストはその前に省略記号で切り捨てられます。

+0

申し訳ありませんが、私が指定した質問では、それもJavaScriptの回避策を使用することはできません。 –

+0

申し訳ありませんが、あなたはハックにreosrtする必要があります:) –

関連する問題