Javascript 如何获取页面上使用的所有单词的数组
因此,我试图获取我的网页中使用的所有单词的数组 应该很容易吧 我遇到的问题是Javascript 如何获取页面上使用的所有单词的数组,javascript,jquery,Javascript,Jquery,因此,我试图获取我的网页中使用的所有单词的数组 应该很容易吧 我遇到的问题是$(“body”).text() i、 e: 但是,$(node).children()对于DOM中存在的任何节点都是真实的,因此这不起作用 我肯定我错过了一些明显的东西,所以我希望多看一眼 值得一提的是,我不需要唯一的单词,只需要文档正文中的每个单词作为数组中的一个元素。我试图用它来生成上下文和词汇与另一组单词的共现,这样就可以复制给定单词的上下文重要性 提前谢谢你的建议 看像这样的怎么样 var res = $('
$(“body”).text()
i、 e:
但是,$(node).children()
对于DOM中存在的任何节点都是真实的,因此这不起作用
我肯定我错过了一些明显的东西,所以我希望多看一眼
值得一提的是,我不需要唯一的单词,只需要文档正文中的每个单词作为数组中的一个元素。我试图用它来生成上下文和词汇与另一组单词的共现,这样就可以复制给定单词的上下文重要性
提前谢谢你的建议
看像这样的怎么样
var res = $('body *').contents().map(function () {
if (this.nodeType == 3 && this.nodeValue.trim() != "")
return this.nodeValue.trim();
}).get().join(" ");
console.log(res);
获取单词数组:
var res = $('body *').contents().map(function () {
if (this.nodeType == 3 && this.nodeValue.trim() != "") //check for nodetype text and ignore empty text nodes
return this.nodeValue.trim().split(/\W+/); //split the nodevalue to get words.
}).get(); //get the array of words.
console.log(res);
你可以这样做
function getwords(e){
e.contents().each(function(){
if ( $(this).children().length > 0 ) {
getwords($(this))
}
else if($.trim($(this).text())!=""){
words=words.concat($.trim($(this).text()).split(/\W+/))
}
});
}
这个问题假设单词在内部不是由元素分隔的。如果您只是创建一个由空格和元素分隔的单词数组,那么您将得到:
Fr<b>e</b>d
另外要考虑的是标点符号。你怎么处理:“有三个人:马克,苏和汤姆。他们不引人注目。一个红头在中间。”你删除所有标点符号吗?还是在修剪前用空白代替?如何重新连接由标记或可能是单词间或单词内标点符号的字符分割的单词?请注意,虽然在单词之间写一个破折号是很流行的,但“正确”标点符号使用的是没有空格的m破折号
不是那么简单
无论如何,一种只使用递归拆分空间和元素,并在任何使用中的浏览器中工作,而不使用任何库支持的方法是:
function getWords(element) {
element = element || document.body;
var node, nodes = element.childNodes;
var words = [];
var text, i=0;
while (node = nodes[i++]) {
if (node.nodeType == 1) {
words = words.concat(getWords(node));
} else if (node.nodeType == 3) {
text = node.data.replace(/^\s+|\s+$/g,'').replace(/\s+/g,' ');
words = !text.length? words : words.concat(text.split(/\s/));
}
}
return words;
}
但它没有处理上述问题
编辑
要避免使用脚本元素,请更改:
if (node.nodeType == 1) {
到
任何应该避免的元素都可以添加到条件中。如果应避免使用多种图元类型,可以执行以下操作:
var elementsToAvoid = {script:'script', button:'button'};
...
if (node.nodeType == 1 && node.tagName && !(node.tagName.toLowerCase() in elementsToAvoid)) {
请参见此处,这可能对您有所帮助。这不适用于非文本节点(nodeType!=3
),例如
@yonilevy:缺少文本
是一个文本节点。每个文本节点仍然可以包含多个单词。您可能希望在空白处拆分每个节点。幸运的是,.map
将返回的数组展平到最终数组中,因此您真正需要做的就是拆分。我不一定喜欢选择所有的元素,但另一种选择是一些递归,它可以嵌套得很深。@PSL,这很有效。只需添加一个:not(“脚本”)来阻止非html。谢谢@JasonNichols哦,是的,如果你身上有脚本:)用元素分隔的单词,例如Fred?@RobG,-
标记不是已经消失了吗?这就是css的用途!Adeneo CSS将不会保存您:Fred
。这同样有效。我遇到的主要问题是由form元素、br和p标记串联而成的元素@罗布:你提出了一个有趣的观点。下面我们来看看你的答案。很好的答案。在我接受一个答案之前,我仍然在阅读所有的答案,但这很好地工作了,而且我认为它在美学上也是很好的代码。谢谢这种方法同样有效,但如果不使用jQuery,就很难过滤掉脚本标签(比如传统上放在正文中的Google Analytics)。我只是将while循环中的所有内容嵌套在一个if($(this).parent().is(“:not('script”))中
statement,运行良好。谢谢!关于如何解决您提出的问题的任何想法。这些解决方案中的任何一个都足以满足当前的需要,但肯定对标点符号的任何反馈感兴趣。不太关心单词部分的样式。它们应该很少出现,不会影响统计分析。
['Fr', 'e', 'd'];
function getWords(element) {
element = element || document.body;
var node, nodes = element.childNodes;
var words = [];
var text, i=0;
while (node = nodes[i++]) {
if (node.nodeType == 1) {
words = words.concat(getWords(node));
} else if (node.nodeType == 3) {
text = node.data.replace(/^\s+|\s+$/g,'').replace(/\s+/g,' ');
words = !text.length? words : words.concat(text.split(/\s/));
}
}
return words;
}
if (node.nodeType == 1) {
if (node.nodeType == 1 && node.tagName.toLowerCase() != 'script') {
var elementsToAvoid = {script:'script', button:'button'};
...
if (node.nodeType == 1 && node.tagName && !(node.tagName.toLowerCase() in elementsToAvoid)) {