javascript - 如何选择 HTML 标签之间的某些文本而不是 anchor 标签

标签 javascript html regex cheerio

我想要实现的目标是给定一个如下所示的 HTML 字符串:

<div>
  <p>Some text, some text <span> some text</span> <a href="xxx">some text 
  <span>ZZZ</span></a></p>
  <p>some text, some text, <span>ZZZ</span></p>
</div>
<div>
  <p>some text <span>ZZZ</span></p>
</div>

我需要找到第一个不在 <a> 中的匹配“ZZZ”标签 所以正确答案是上面HTML字符串中出现的第二个ZZZ

我目前正在使用 Cheerio JS,但不是循环遍历每个元素并尝试确定是否有 <a>亲们,有没有更简单的方法呢?

我尝试过正则表达式,如 <([\w]+)[^>]*>(.*?)ZZZ(.*?)<\/\1>并循环遍历所有实例以确定封装标签是否为 <a>或不。但我无法全神贯注地考虑嵌套标签。

最佳答案

我认为循环元素可能是更简单的方法......

let target = null;

// find the element that inner text is 'ZZZ' and not in an a tag
let find = e => 
  !target && (
    (e.innerText === 'ZZZ' && e.tagName !== 'A' && (target = e)) || 
    (e.tagName !== 'A' && e.childElementCount > 0 && [...e.children].forEach(find))
  );

[...document.body.children].forEach(find);

console.log(target);
<div>
  <p>Some text, some text <span> some text</span><a href="xxx">some text 
  <span id="1">ZZZ</span></a></p>
  <p>some text, some text, <span id="2">ZZZ</span></p>
</div>
<div>
  <p>some text <span id="3">ZZZ</span></p>
</div>

关于javascript - 如何选择 HTML 标签之间的某些文本而不是 anchor 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57780748/

相关文章:

javascript - 上传文件nodejs和Angular强大

javascript - 为 `<select>` s 的所选选项显示不同的文本

javascript - 正则表达式如何用一个空格替换多个空格

c++ - 长正则表达式会导致错误

javascript - 谷歌浏览器说无法读取未定义的属性 "calculator"- 计算器是函数名称

javascript - 在 Angular 中调用 $post 时如何使用 MVC 重定向

javascript - 如果我们有 1 个数据,则隐藏堆积柱形图中的数据标签

html - XPath在子元素中测试文本?

html - Gmail 阻止内联 css 属性

javascript - 以下格式的日期正则表达式验证器 "MMM d, y HH:mm"