2017-06-15 146 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/