4

これらの文字列は長い段落である可能性があるため、文字列全体をスペース区切り文字で分割するのが最善かどうかはわかりません。たとえば、最初の10語を取得して、それらをスパンでラップしようとしています。

'<span class="easing">' + string + '</span>'

次に、元の分割の後半でそれを再結合します。これを行うための超効率的な方法に関する提案はありますか?一度にページの最大3つの段落に影響します。

編集済み

ここにキッカーがあります—分割は9番目の単語の後で、または最初の文の終わりで発生する必要があります(その文が9単語未満の場合)。

var origString = 'Coming into the world on Elvis’ birthday with a doctor named Presley seemed fortuitous until, wielding the silvery smooth scalpel in his aged unsteady hand, the doctor sliced through the walls of my mother’s uterus and into my unborn skin. Inside the warm soothing waters of my mother’s womb, inside the silent weightlessness, I was safe. Then the prick of cold steel marked the first in a series of rude awakenings. I was scarred for life even before birth.';
var newString = '<span="easing">Coming into the world on Elvis’ birthday with a doctor</span> named Presley seemed fortuitous until, wielding the silvery smooth scalpel in his aged unsteady hand, the doctor sliced through the walls of my mother’s uterus and into my unborn skin. Inside the warm soothing waters of my mother’s womb, inside the silent weightlessness, I was safe. Then the prick of cold steel marked the first in a series of rude awakenings. I was scarred for life even before birth.';

または、段落を開始する短い文で:

var origString = '“Is he okay? Tell me everything’s okay” she pleas, her desperate need to confirm my health competing with her own need for consolation.';
var newString = '<span class="easing">“Is he okay?</span> Tell me everything’s okay” she pleas, her desperate need to confirm my health competing with her own need for consolation.';
4

4 に答える 4

2

最大で約100文字しかスキャンしないことを考えると(URIまたは非常に長い単語がない場合)、文字ごとのスキャンが非常に最適です。特定の場所で.indexOf()を使用することでこれを最適化できますが、文を終了する可能性のあるさまざまな文字をチェックする必要があることで得たものを失うことになります。

function spanomatic ( str, words ) {
  var i, l, c;
  for ( i=0, l=str.length; i<l; i++ ) {
    c = str.charAt(i);
    if ( c == ' ' ) {
      if ( words-- <= 0 ) {
        str = '<span>'+str.substring(0,i)+'</span>'+str.substring(i);
        break;
      }
    }
    else if ( ('?!.;:').indexOf(c) != -1 ) {
      str = '<span>'+str.substring(0,i)+'</span>'+str.substring(i);
      break;
    }
  }
  return str;
}

spanomatic ( 'Pass your string here', 9 );

(上記のコードは、テキストが常に正しく文法的に終了することを前提としています(つまり、?!。; :)の少なくとも1つが含まれています。そうでない場合、9語未満の段落がスパンレスになる可能性があります。ただし、いくつかの変更により修正されました...)

将来の読者のための注意

文字列検索を行う「非常に効率的な」方法を使用する場合は、正規表現を避けてください(本当にその能力が必要な場合を除く)。この質問に対する受け入れられた答えは簡潔でうまくまとめられた関数です-誤解しないでください-しかし、forループで文字列をスキャンするよりも約70%遅いです(少なくともFireFoxとChromeでの私のテストでは) ...これは、正規表現の定義をBergiの関数の外に移動した後で比較する場合でも同じです(つまり、関数が呼び出されるたびに正規表現を再作成するのではなく、事前にコンパイルされたregexpを使用します)

http://jsperf.com/compare-regexp-vs-char-scanning

于 2012-09-15T19:35:21.597 に答える
1
return string.replace(/.+?[,.?!]|.+$/, function(match, index, string){
    var words = match.split(/\s+/);
    words[ words.length<10 ? words.length-1 : 9 ] += '</span>';
    return '<span class="easing">' + words.join(" ");
});

これは、最初の文のようなもの(または文字列全体-改行がない限り)と一致し、そのスパンの最初の10語をラップします。両方のサンプル入力で機能しますが、小さい入力でも機能します。空の文字列に対して空の文字列を返します…|.*$。空のスパンが必要な場合は、正規表現をに変更します。

于 2012-09-15T18:59:26.290 に答える
0

ここ。それは少しコードゴルフですが。ごめん。

$( 'p' ).html(function ( i, text ) {
    var re = /(.+?)\s/g, c = 0, res;   
    while ( res = re.exec( text ) ) if ( ++c === 10 || res[1].slice( -1 ) === '.' ) break;

    var p = re.lastIndex;
    return '<span class="easing">' + text.slice( 0, p ) + '</span>' + text.slice( p );  
});

ライブデモ: http: //jsfiddle.net/3DaEV/

于 2012-09-15T19:38:46.177 に答える
0

このコードはどうですか:

var str = 'asda adsfadsf asdfadfadsf adsfsdafadf. adfadfadfad adfadfdaf adfadfadf adfadf \afsgasfggasfg SFGDFGDSFGH dfghdsghdgas hadghdagh';

var sentences = [], words = str.split(' ');
for (var i = 0; i < 9; i++) {
    if (words[i].lastIndexOf('.') !== -1) {
        sentences.push(words[i]);
        break;    
    } else {
        sentences.push(words[i]);
    }        
}

words.slice(sentences.length, words.length);


$('<span>' + sentences.join(' ') + '</span>').appendTo($('#log'));

私はあなたがテストできるようにそれをフィドルの下に持っています。arr1の残りの部分とループでこれを実行する必要があります。

アップデート:

終止符だけでなく、?!:;などの場合。次に、を作成するRegExp代わりにテストしますlastIndexOf('.')

于 2012-09-15T19:13:04.590 に答える