需要关于特定需求的Javascript html解析器的帮助
问题描述:
我的问题有点复杂,我会尽我所能解释它。需要关于特定需求的Javascript html解析器的帮助
我在做什么?
我想为用户提供一个脚本,他们可以添加到他们的网页/博客中,这个脚本会在他们的网页上突出显示cretain文字,并将其显示在悬停上的菜单/框放入其中。像kontera的东西。
要做到这一点,我做了以下内容:
1.解析该脚本通过以下方法加载页面的HTML:
Regexp to search/replace only text, not in HTML attribute
(见第一个答案)
2.如果它是一个文本节点,而不是检查其中存在的任何关键字的文本节点的值。 (我有大约1000个关键字),如果找到关键字,请将其替换为突出显示的文本和所需的内容。
当我将这个应用到blogger.com上的博客时,挂钩浏览器是因为解析器函数以递归方式调用自身。
我试图通过将我的关键字限制为只有5个100来确认这一点。
比解决它我限制,如果节点的类型DIV或P或BODY比只调用函数递归,仍然挂起。
当我删除DIV并只留下P和BODY时,它就会起作用。
你能帮我吗?提前致谢! :)
答
我不相信你需要一个递归函数。有什么任何理由这样是行不通的?:
var searchTerms = [ ... your list of words ... ];
for (var i = 0; i < searchTerms.length; i++) {
var regex = new RegExp(">([^<]*)?("+searchTerms[i]+")([^>]*)?<","ig");
var tempinnerHTML = element.innerHTML;
element.innerHTML = tempinnerHTML.replace(regex,'>$1<span style="background-color:#DDF">$2</span>$3<');
}
答
也许你可以尝试用不同的方式来标记内包裹的关键字词。我使用此代码在文档中进行搜索(创建了Search Bookmarklet for iPad,以便在MobileSafari中进行搜索)。
var SearchFor = {
run: function(defaultText){
if (!defaultText) {
defaultText = "";
}
var searchText = prompt("Search for:", defaultText);
if (!searchText) {
return false;
}
return this.highlightKeyword(searchText);
},
highlightKeyword: function(searchText) {
var searchArray = [searchText];
if (!document.body || typeof(document.body.innerHTML) == "undefined") {
return false;
}
var bodyText = document.body.innerHTML;
for (var i = 0; i < searchArray.length; i++) {
bodyText = this.highlight(bodyText, searchArray[i]);
}
document.body.innerHTML = bodyText;
return true;
},
highlight: function(bodyText, searchTerm) {
var highlightStartTag = "<span style='color:#CCCCCC; background-color:#FAF9DC;'>";
var highlightEndTag = "</span>";
var newText = "";
var i = -1;
var lcSearchTerm = searchTerm.toLowerCase();
var lcBodyText = bodyText.toLowerCase();
while (bodyText.length > 0) {
i = lcBodyText.indexOf(lcSearchTerm, i+1);
if (i < 0) {
newText += bodyText;
bodyText = "";
} else {
// skip anything inside an HTML tag
if (bodyText.lastIndexOf(">", i) >= bodyText.lastIndexOf("<", i)) {
// skip anything inside a <script> block
if (lcBodyText.lastIndexOf("/script>", i) >= lcBodyText.lastIndexOf("<script", i)) {
newText += bodyText.substring(0, i) + highlightStartTag + bodyText.substr(i, searchTerm.length) + highlightEndTag;
bodyText = bodyText.substr(i + searchTerm.length);
lcBodyText = bodyText.toLowerCase();
i = -1;
}
}
}
}
return newText;
}
};
SearchFor.run('KeywordExample');
在我的问题提到的链接,还有乍得评论:
也许你需要如果有效,你可以重新利用它。你能证实这是做这件事的最好方法吗?至少安全的做法呢? – happyhardik 2010-08-20 16:14:21
我不能*保证*这是最好的,或者甚至是安全的方法来做到这一点,因为HTML不是XML的子集。这取决于您的预期输入。但是,我一直在使用类似的脚本。 – 2010-08-21 00:52:31