1

半構造化されたマークアップ テキスト (太字、斜体など) であるサード パーティの HTML を処理しています。

構造の単純化されたサンプルを次に示します。

<div>
  <strong class="term">one</strong>
  -
  <b class="defs">
    foo        
    <i class="pos">verb</i>
    bar
    <i class="pos">noun</i>
    baz
    <i class="pos">adjective</i>
    blah
  </b>
  <br>
  <strong class="term">two</strong>
  ... etc ...
</div>

実は、この形にするために、すでに少し加工しています。HTML 要素は問題なく処理できますが、インターリーブされたテキストと<i>要素を処理する方法がわかりません。

s の周りの「定義」を分割する<i>ソリューション、パーツを反復処理するソリューションなどに満足しています。ブラウザ固有の癖があるため、jQuery と「生の」DOM API 呼び出しを混在させたくないのですが、避けられないなら分かる。私の浅い知識から、jQuery は「構造化された」HTML ほどマークアップされたテキストを適切にサポートしていないようです...

明らかな何かが欠けていますか?これを探すのはなかなか難しそうですね…。


実世界のデータでは、テキスト ランと<i>ノードは常にインターリーブされますが、 内の最初のものはdefsいずれかである可能性があり、各テキスト ランは 1 つ以上の実際のテキスト ノードで構成される場合があります。これは、<i>とテキスト ランがペアになっていないことを意味します。

適切な解決策としては、各テキスト ランにマークアップを追加するか、テキスト ランごとに 1 つのことを実行して反復することです<i>jQuery.contents()ノードタイプのチェックが鍵になるはずだと考えています...

4

2 に答える 2

3

次のようにして、すべてのテキストを配列に取得できます

$(function(){
  var json = $('.defs').contents().map(function(){
     var text = $.trim($(this).text()); 
     return  text != "" ? text : null;
  });

  console.log(json);
});​

デモ: http://jsfiddle.net/joycse06/Z5AgL/

上記のコードdefsは、テキストノードとi.

アップデート

そうです、map 関数を使用して、またはその内部でノード タイプまたは名前のチェックを行うことができthis.nodeNameますthis.nodeTypenodeTypetextnodeはあり3ます。たとえば、これを内部に追加して.map()確認します

console.log(this.nodeName,this.nodeType);

したがって、この特定のマークアップ構造については、次のようにして、それが<i>またはtextnode

if(this.nodeName.toLowerCase() == 'i'){
    console.log('<i>');
    // do stuff for <i> here
}    
else{
    console.log('Text Node');            
    // it's text node
}  

// or with nodeType

if(this.nodeType == 3){
 // textNode
}else{
 // <i> 
}  

デモ: http://jsfiddle.net/joycse06/Z5AgL/6/

于 2012-06-16T16:41:08.850 に答える
1

あなたの構造があなたが私たちに示すように常にあるなら、あなたはこれを行うことができます:

var defs = [];
var def = null;
var tokens = $('.defs').text().split('\n');
for (var i=0; i<tokens.length; i++) {
    if (tokens[i].trim().length>0) {
        if (def==null) {
            def = {name:tokens[i]};
        } else {
            def.value = tokens[i];
            defs.push(def);
            def = null;
        }
    }
};
console.log(defs);

もちろん、持っているものに応じて、保護を追加したり、強化したりする必要がありますが、実行できる種類の操作の精神を得ることができます.

別の解決策は、すべての部分を斜体で ( を使用して) 取得し、最初の位置(最後に抽出されたペアの後の最初の$('.pos')位置) を探すことでした。$('.defs').text()

于 2012-06-16T16:33:12.333 に答える