需要关于特定需求的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<'); 
} 
+0

在我的问题提到的链接,还有乍得评论:

也许你需要如果有效,你可以重新利用它。你能证实这是做这件事的最好方法吗?至少安全的做法呢? – happyhardik 2010-08-20 16:14:21

+0

我不能*保证*这是最好的,或者甚至是安全的方法来做到这一点,因为HTML不是XML的子集。这取决于您的预期输入。但是,我一直在使用类似的脚本。 – 2010-08-21 00:52:31

也许你可以尝试用不同的方式来标记内包裹的关键字词。我使用此代码在文档中进行搜索(创建了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');