如何使以AB开头的单词可点击?

时间:2018-06-24 23:56:12

标签: javascript jquery greasemonkey

以下是一些基本的HTML:

<p>Here is a reference: AB-AAA111</p>
<p>Here is a reference: AB-BBB222</p>
<p>Here is a reference: AB-CCC333, AB-DDD444</p>
<p>Here is a reference: AB-EEE555</p>

如您所见,每个段落都包含一个以AB-开头的引用-

最终目标:在Geasemonkey中使用JS / jQuery,使每个AB-参考都可单击。例如:

<p>Here is a reference: <a href="localhost/AAA111"> AB-AAA111 </a> </p>

我知道如何使用Regex来挑选以AB- / AB- \ w + / gi开头的单词,并且我知道如何分配变量并替换字符串的特定部分。

在这种情况下,我不知道怎么缝在一起?

2 个答案:

答案 0 :(得分:0)

如果您真的想通过一个简单的正则表达式来做到这一点,则可以使用以下代码:

document.body.innerHTML = document.body.innerHTML
  .replace(/\bAB-(\w+)/g, '<a href="http://localhost/$1">$&</a>');

但是,请注意,仅替换HTML文档中的字符串始终是一个非常糟糕的主意。想象一下,例如可能有一些类名,例如<div class="AB-123" id="abc">。这种方法会破坏整个站点。不要在您无法控制的网站上使用它。

相反,请尝试仅解析文本节点。 document为您提供了在特定节点上工作的evaluate方法。您也可以搜索所有文本节点,例如:

let nodes = document.evaluate('//text()[contains(.,"AB-")]', document,
  null, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null);

这将为您提供可以由nodes.iterateNext()进行迭代的节点列表。缺点是解析AB-<b>123</b>之类的超文本变得非常困难。

答案 1 :(得分:-1)

您实际上不需要使用正则表达式

inputs = document.getElementsByTagName('p');

for(var i = 0; i < inputs.length; i++) {
  var p = inputs[i].innerHTML.substring(21);

  if(p.startsWith("AB")) {
    inputs[i].innerHTML = "<a href='*'>" + p;
    inputs[i].innerHTML += "</a>";
  }
}

只需修剪不包含AB ...序列的字符串的开头部分。之后,您需要做的就是检查开头是否以AB开头并修改这些元素的innerHTML。

如果您想在该部分使用正则表达式,请使用类似的

var re = new RegExp("^AB");
var match = re.test("AB");

查看它是否以该序列开头。

我敢肯定,可以在这些项目上添加标签的方法更为精细,但这很简单而且可行。

希望这会有所帮助,欢呼