Jquery 正则表达式使用ChereIO搜索格式不良的HTML的叶节点

Jquery 正则表达式使用ChereIO搜索格式不良的HTML的叶节点,jquery,html,parsing,nodes,cheerio,Jquery,Html,Parsing,Nodes,Cheerio,我有一些格式不好的HTML(如下面的一个),我希望得到文本与给定正则表达式匹配的叶节点(没有任何其他子节点): <html> <head> <title>co20140725-ex99_1.htm</title> </head> <body bgcolor="#ffffff" style="DISPLAY: inline; FONT-FAMILY: Times New Roman; FONT-SIZE: 10p

我有一些格式不好的HTML(如下面的一个),我希望得到文本与给定正则表达式匹配的叶节点(没有任何其他子节点):

<html>
  <head>
    <title>co20140725-ex99_1.htm</title>
  </head>
  <body bgcolor="#ffffff" style="DISPLAY: inline; FONT-FAMILY: Times New Roman; FONT-SIZE: 10pt">
  <div>
  <div style="TEXT-ALIGN: left">&#160;</div>
  <div style="TEXT-ALIGN: right">EXHIBIT 99.1</div>
  <div style="TEXT-ALIGN: left">&#160;</div>
  <div style="TEXT-ALIGN: left">
  <div style="TEXT-INDENT: 0pt; DISPLAY: block; MARGIN-LEFT: 0pt; MARGIN-RIGHT: 0pt" align="left">
  <div style="TEXT-ALIGN: center"><font style="FONT-WEIGHT: bold">ANNOUNCES</font></div>
</html>
  • 每个
    ,然后标准JavaScript
    匹配

    $('body').each(function (i, elem) {
      if ($(this).text().match(/announces/i)) {
        var text = $(this).text();
      }
    }
    
  • 子项
    ,但它输出一个字符串,即HTML中的所有文本:

    $('p, b, div, font').children(':contains("string I\'m looking for but this isn\'t case-sensitive like match is")').children().first().text();  
    
  • 我相信问题在于,嵌套子元素的数量是可变的,出于某种原因,我确实得到了所有元素,但每个元素都有一堆子元素,我无法遍历它们并测试文本

    您可以看到有一组可变的嵌套元素,通常
    .find()
    可以搜索
    中的所有元素,但是
    .find()
    过滤器()
    在这种情况下根本不起作用

    关于如何在这个HTML中搜索文本,我有什么想法吗


    可以找到完整的HTML示例。

    澄清后,问题分为两部分:

  • ,也就是说,那些没有自己的孩子,但只包含您要查找的文本的孩子。这将避免您在第三种方法中使用
    儿童时遇到的问题。有两种方法可以做到这一点:

    • *:not(:具有('*'))
      选择器
    • 选择所有元素(
      “*”
      ),然后筛选没有子元素的节点。这比流行的复杂选择器方法快几倍
  • 过滤叶节点以查找那些
    textContent
    与正则表达式匹配的节点

  • 代码如下:

    $('*').map(function() {
      if (this.children.length) return null;
      if (this.textContent.match(/N/)) return this.textContent;
    });
    
    (忽略
    window.runnerWindow.proxyConsole
    无关的输出;它是一个JSBin工件。)

    $('*').map(function() {
      if (this.children.length) return null;
      if (this.textContent.match(/N/)) return this.textContent;
    });