如何通过搜索纯文本来找到HTML中具有标记文本的节点?

时间:2019-03-15 13:09:10

标签: javascript xpath

我正在尝试使用xpath或javascript(节点)库在HTML文档中查找在其内部文本中包含特定字符串的“最近”节点;在类似HTML的代码段中

<p>Lorem ipsum dolor sit <strong>amet, <em>{cons</em>ectetur} adipiscing elit.</strong> Morbi rhoncus lacinia orci a dapibus. Nulla facilisi. Sed id nibh ornare, aliquet ante nec, efficitur leo. Sed viverra ex turpis,</p>

如果我要寻找与{cons.*tur}匹配的单词,那么在这种情况下{consectetur},我想找到<strong>节点而不是<p>节点,因为那是拥有它的最小节点。

edit:strong只是一个示例,它可以是任何tagName,并且可以嵌套得很深;如上例所示,我要查找的单词也可以分布在两个以上的嵌套级别中。

更多编辑:我实际上是在寻找一种模式,因此//div[contains(., 'consectetur')]不起作用。

2 个答案:

答案 0 :(得分:1)

  

如果我要寻找与{cons.*tur}匹配的单词,那么在这种情况下,   {consectetur},我想找到<strong>节点而不是<p>   节点,因为这是拥有该节点的最小节点。

您需要一个表达式,该表达式选择具有与模式匹配的字符串值的最后一个后代元素。所以

/descendant::*[contains(.,'{consectetur}')][last()]

如果要选择的元素(不同分支)不止一个,那么您将需要一个表达式选择并且该元素与您的模式匹配,而没有后代也与之匹配。

//*[contains(.,'{consectetur}') and not(.//*[contains(.,'{consectetur}'])]

关于然后模式

如果要使用正则表达式,则至少需要XPath 2.0 functions。您在XPath 1.0中当前的模式{cons.*tur}

相同
contains(substring-after(.,'{cons'),'tur}')

答案 1 :(得分:0)

使用listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { itemsList.remove(position); removeItem((long) view.getTag()); adapterColumns.notifyDataSetChanged(); Log.e(TAG, "delete_tag" + id); return false; } }); 属性从标记中提取文本。

.textContent
const str = document.querySelector('body *:not(script)').textContent;
console.log(str);

const rgx = /consectetur/g;

let res = rgx.exec(str);
while (res !== null) {
  console.log(res[0]);
  res = rgx.exec(str);
}