2017-06-15 53 views
1

我正在構建一個擴展chrome,它根據匹配的特定正則表達式向網頁添加鏈接。我使用jQuery來從body標籤如下內得到所有的文本節點,然後匹配正則表達式,如果需要添加一個鏈接: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元素的內容,然後對文本節點進行過濾。之後,您可以add所有其他元素,除了腳本標籤:

$('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

此代碼使用正則表達式來選擇body標籤只有文字。它不包含腳本標籤內的文本,並且不包括子元素中的文本。我不確定你的所有代碼,但這應該有所幫助。

// 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/