2017-06-15 58 views
1

私は、特定の正規表現に一致するWebページへのリンクを追加するクロム拡張を構築しています。私は次のようにbodyタグ内のすべてのテキストノードを取得するためのjQueryを使用して、正規表現にマッチし、必要に応じてリンクを追加しています:JQuery - タグで囲まれていないテキストを見つける

$('*', 'body').contents().filter(function() { 
    return this.nodeType === 3 
}).each(function() { 
    regexMatchFn($(this), $(this).text()); 
}); 

だから、これは本体内のタグで囲まれたテキストのために正常に動作しますHTMLページのしかし、私は、テキストがタグに囲まれていないページでシナリオをテストしており、私は前述の方法でそれをキャプチャできません。ここで

は私のトラブルを引き起こしているマークアップの例です:

<body> 
    text-not-captured 
    <p>text-captured</p> 
    <p>text-captured</p> 
</body> 

このようなシナリオでは、非捕捉テキストをキャプチャするための最良の方法だろうか?

+0

が、これはその文脈の子として '$(この)、$(この)は.text()'コンテキストを何をするのでしょうか? – guradio

+0

@guradioノードとノードの内容を正規表現マッチング関数に渡しています。 – morris295

+0

このシナリオで正しいコンテキストを参照してもよろしいですか? – guradio

答えて

0

は実際には、単にこれを行うこと:

$("body").text() 

はタグなしで体の内部のすべてのテキストを取得します。

これには<script>タグ内のタグも含まれていますので、ご注意ください。

あなたはスクリプトタグとは別に、すべてを取得したい場合は、あなたの代わりにこれを行うことができます:あなたが探しているもの

var all = $("body").html(); 
console.log($($.parseHTML(all)).text()); 
+0

"これには

0

本当にわからないが、これはあなたが考えていたものでしょうか?

jQuery add()でちょっと錆びているかもしれませんが、body要素だけの内容を取得してからテキストノードをフィルタリングする必要があると思います。このコードは、bodyタグ内のテキストのみを選択するように正規表現を使用しています

$('body').contents().filter(function() { 
 
    return this.nodeType === 3 && this.wholeText.replace(/\s+/g, '') !== '' 
 
}).add('body *:not(script)').each(function() { 
 
    console.log($(this).text()); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<body> 
 
    text-not-captured 
 
    <p>text-captured</p> 
 
    <p>text-captured</p> 
 
</body>

0

:その後、あなたはaddスクリプトタグを除く他のすべての要素をすることができます。スクリプトタグ内のテキストは含まれず、子要素のテキストは含まれません。私はすべてのあなたのコードについては分かりませんが、これは助けになるはずです。

// remove the scripts from the page 
$("body > script").remove(); 

// regex match only text in the body tag 
var requiredText = document.body.innerHTML.match(/(\w+)(?![^<]*>|[^<>]*<\/)/igm); 

console.dir(requiredText); 

例フィドルhttps://jsfiddle.net/mikeferrari/wrfwo5mu/

関連する問題