我有一些格式不正确的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"> </div>
<div style="TEXT-ALIGN: right">EXHIBIT 99.1</div>
<div style="TEXT-ALIGN: left"> </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>
我正在使用cheerio,它基本上实现了jQuery遍历API。到目前为止我尝试过的事情:
:contains
选择器不支持正则表达式,甚至不区分大小写的文本:
var text = $('body').filter(':contains("ANNOUNCES")');
each
,然后是标准JavaScript match
:
$('body').each(function (i, elem) {
if ($(this).text().match(/announces/i)) {
var text = $(this).text();
}
}
children
,但它会输出一个字符串,该字符串是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()
可用于搜索<body>
但.find()
和.filter()
中的所有元素在这种情况下根本不工作。
关于如何在此HTML中正则搜索文本的任何想法?
可以找到完整的示例HTML here。
答案 0 :(得分:2)
澄清后,问题分为两部分:
Get only the leaf nodes,即那些没有自己孩子的人,但只包含你之后的文字。这将避免您使用children
进行第三种方法时遇到的问题。有两种方法可以做到这一点:
*:not(:has('*'))
选择器'*'
),然后筛选零孩子的节点。这比流行的复杂选择器方法快几倍。为textContent
与正则表达式匹配的人筛选叶节点。
以下是代码:
$('*').map(function() {
if (this.children.length) return null;
if (this.textContent.match(/N/)) return this.textContent;
});
Here's the JSBin.(忽略window.runnerWindow.proxyConsole
无关的输出;它是一个JSBin工件。)