gpt4 book ai didi

javascript - 仅匹配不在 <script> 或 标签中的字符串

转载 作者:搜寻专家 更新时间:2023-11-01 05:26:28 26 4
gpt4 key购买 nike

我正在开发一个浏览器插件,它用 <a href="http://domain.com/$1">$1</a> 替换“someString”(由复杂的正则表达式定义)的所有实例.这通常可以正常工作,只需对 body 的 innerHTML 进行全局替换。但是,当它在 <script> 中找到(并替换)“someString”时,它会破坏页面标签(即作为 JS 变量或其他 JS 引用)。如果“someString”已经是 anchor 的一部分,它也会中断。

所以基本上我想对“someString”的所有实例进行全局替换,除非它落在 <script></script> 中。或 <a></a>标签集。

基本上我现在拥有的是:

var body = document.getElementsByTagName('body')[0].innerHTML;
body = body.replace(/(someString)/gi, '<a href="http://domain.com/$1">$1</a>');
document.getElementsByTagName('body')[0].innerHTML = body;

但显然这还不够好。我已经苦苦挣扎了几个小时,并阅读了这里的所有答案(包括许多坚持正则表达式不应与 HTML 一起使用的坚定答案),所以我愿意接受有关如何执行此操作的建议。我更喜欢直接使用 JS,但如果需要也可以使用 jQuery。

编辑 - 示例 HTML:

<body>
someString
<script type="text/javascript">
var someString = 'blah';
console.log(someString);
</script>
<a href="someString.html">someString</a>
</body>

在这种情况下,只应替换“someString”的第一个实例。

最佳答案

试试看它是否满足您的需求(已在 IE 8 和 Chrome 中测试)。

<script src="jquery-1.4.4.js" type="text/javascript"></script>
<script>
var pattern = /(someString)/gi;
var replacement = "<a href=\"http://domain.com/$1\">$1</a>";

$(function() {
$("body :not(a,script)")
.contents()
.filter(function() {
return this.nodeType == 3 && this.nodeValue.search(pattern) != -1;
})
.each(function() {
var span = document.createElement("span");
span.innerHTML = "&nbsp;" + $.trim(this.nodeValue.replace(pattern, replacement));
this.parentNode.insertBefore(span, this);
this.parentNode.removeChild(this);
});
});
</script>

该代码使用 jQuery 查找文档的 <body> 中的所有文本节点。不在 <anchor> 中或 <script> block ,并包含搜索模式。一旦找到这些,就会注入(inject)一个包含目标节点修改内容的跨度,并删除旧文本节点。

我看到的唯一问题是 IE 8 处理仅包含空格的文本节点的方式与 Chrome 不同,因此有时替换会丢失前导空格,因此在包含正则表达式替换的文本之前插入不间断空格。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com