我正在尝试使用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')]
不起作用。
答案 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);
}