2

「truncate words」は一連の単語を取り、最初の、たとえば 10 単語だけを返します。

dojo (javascript ライブラリ) には、そのような関数があり、そのコードは次のとおりです。

truncatewords: function(value, arg){
    // summary: Truncates a string after a certain number of words
   // arg: Integer
   //              Number of words to truncate after
   arg = parseInt(arg);
   if(!arg){
           return value;
   }

   for(var i = 0, j = value.length, count = 0, current, last; i < value.length; i++){
           current = value.charAt(i);
           if(dojox.dtl.filter.strings._truncatewords.test(last)){
                   if(!dojox.dtl.filter.strings._truncatewords.test(current)){
                           ++count;
                           if(count == arg){
                                   return value.substring(0, j + 1);
                           }
                   }
           }else if(!dojox.dtl.filter.strings._truncatewords.test(current)){
                   j = i;
           }
           last = current;
   }
   return value;
}

どこdojox.dtl.filter.strings._truncatewords.ですか/(&.*?;|<.*?>|(\w[\w-]*))/g

なぜこれは次のように書かれていないのですか?

function truncate(value,arg) {
    var value_arr = value.split(' ');
    if(arg < value_arr.length) {
        value = value_arr.slice(0,arg).join(' '); }
    return value;
}

違いは何ですか?

4

4 に答える 4

3

分割では、一連の空白文字が単語区切りであることを考慮する必要があります。のような正規表現で分割する必要があり\s+ます。

しかし、それ以外では、dojo のコードはエンティティーと xml タグも単語として使用しているようです。文字列にそのようなものが含まれていないことがわかっている場合は、実装でうまくいく可能性があります。ただし、スライスが検出された単語数を超えないように注意してください。これには少しチェックが必要になる場合があります。

于 2009-06-09T19:57:37.880 に答える
0

あなたが見ているコードは、django テンプレート言語をサポートするための dtl ライブラリーからのものです。( http://www.dojotoolkit.org/book/dojo-book-0-9/part-5-dojox/dojox-dtl )。そこにあるコードは、単純な文字列分割を行うためのものではなく、使用しているテンプレートを解析するためのものだと確信しています。

また、その正規表現を見ると、スペースだけでなく、より多くのシナリオを処理しています...たとえば、 <.*?> を使用すると、開始タグと終了タグで囲まれた単語のグループが「単語」と見なされます。

于 2009-06-09T19:56:57.350 に答える
0
  1. function宣言: これはおそらく JavaScript オブジェクトであり、使用するとfunction_name: function(params) {...JavaScript がグローバル スコープから除外されます。
  2. 変数をチェックargすることで、整数が渡されたことを確認しています。を使用すると、とparseInt()の両方が受け入れられます。10"10"
  3. このメソッドは、使用されている正規表現により、スペースよりも多くの区切り文字を処理できます。
  4. このコードは、配列のオーバーフローに対して安全です。8 語しかない場合、10 まで数えることはできませんvalue。そうしないと、配列が範囲外になるか、オブジェクトが存在しないというエラーが発生します。
于 2009-06-09T20:00:30.557 に答える
0

正規表現は3つの部分です

  1. &.*?; 文字エンティティ (& など) と一致します
  2. <.*?> は山括弧内のものと一致します
  3. (\w[\w-]*) は、[a-zA-Z0-9_] で始まり、その後にダッシュが続く文字列に一致します。

スペースで分割するだけではありません。単語の一部である可能性があると思われるものを探し、そうでないものを見つけると、単語数を増やします。

コンマまたはパイプで区切られたリストを取り、スペースで区切られたリストと同様に機能する必要があります。

于 2009-06-09T20:10:59.177 に答える