0

テキストと単語数を受け入れる次の関数があり、テキスト内の単語数が単語数を超えた場合、省略記号で切り捨てられます。

#Truncate the passed text. Used for headlines and such
  def snippet(thought, wordcount)
    thought.split[0..(wordcount-1)].join(" ") + (thought.split.size > wordcount ? "..." : "")
  end 

ただし、この関数が考慮しないのは、たとえば非常に長い単語です...

「ハローオオオオオオオオオオオオオオオオオオオオオオオオオオオオオオオオオ ワールド!」

私がやろうとしていることにアプローチするためのより良い方法があるかどうか疑問に思っていたので、効率的な方法で単語数とテキストサイズの両方を考慮に入れています。

4

5 に答える 5

4

これは Rails プロジェクトですか?

次のヘルパーを使用しない理由:

truncate("Once upon a time in a world far far away", :length => 17)

そうでない場合は、コードを再利用してください。

于 2012-06-27T20:47:57.210 に答える
2

これはおそらく 2 段階のプロセスです。

  1. 文字列を最大長に切り詰めます (これには正規表現は必要ありません)
  2. 正規表現を使用して、切り捨てられた文字列から最大単語数を見つけます。

編集:

別のアプローチは、文字列を単語に分割し、配列をループして長さを合計することです。オーバーランを発見したら、オーバーランjoin 0 .. index直前。

于 2012-06-27T21:10:41.507 に答える
1

ヒント:正規表現^(\s*.+?\b){5}は最初の 5 つの「単語」に一致

于 2012-06-27T20:42:09.033 に答える
0

単語と文字の両方の制限をチェックするためのロジックは複雑になりすぎて、1 つの式として明確に表現できなくなります。私は次のようなことを提案します:

def snippet str, max_words, max_chars, omission='...'
  max_chars = 1+omision.size if max_chars <= omission.size # need at least one char plus ellipses
  words = str.split
  omit = words.size > max_words || str.length > max_chars ? omission : ''
  snip = words[0...max_words].join ' '
  snip = snip[0...(max_chars-3)] if snip.length > max_chars
  snip + omit
end

他の人が指摘しているように、Rails String#truncate は必要なほとんどの機能を提供します (自然な境界で長さに合わせて切り捨てます) が、最大文字長と単語数を個別に指定することはできません。

于 2012-06-27T20:58:56.130 に答える