我试图制作一个Firefox扩展程序,以过滤出cuss单词,作为测试,我尝试过滤掉“ the”一词并替换为“!@#$”,但是当我运行时,什么也没有发生我不知道为什么。有人可以帮忙吗?这是我的代码:
function replaceText(selector, text, newText, flags) {
var matcher = new RegExp(text, flags);
var elems = document.querySelectorAll(selector), i;
for (i = 0; i < elems.length; i++)
if (!elems[i].childNodes.length)
elems[i].innerHTML = elems[i].innerHTML.replace(matcher, newText);
}
var selectorsToUse = ["p", "h1", "h2", "h3", "h4", "h5", "h6", "a", ];
var curseWords= [["the" "!@#$"]]
for(curseRegex = 0; curseRegex < curseWords.length; curseRegex++;)
{
for(i = 0; i < selectorsToUse.length; i++)
{
replaceText(selectorstouse[i], cursewords[curseregex][0],
curseWords[curseRegex][1], "gi");
};
};
我顺便用了别人的代码
答案 0 :(得分:1)
所有这些代码似乎比必要的工作还要多。使用正则表达式尝试一些更简单的操作。例如,/the/ig
。表达式(在这种情况下仅为单词)写在正斜杠之间。小i
是不区分大小写的,因此“ the”,“ THE”,“ The”以及任何其他组合将始终匹配。小g
是用于全局的,因此您可以在当前字符串中获取“ the”的所有实例。如果您想添加更多单词,只需添加|
和下一个单词,例如/the|dog/ig
。您可以根据需要连续输入多个单词。 /the|dog|cow|cat/ig
尝试一下:
const curses = /the/ig
const filterStr = '!@#$'
const selectors = ['p', 'h1', 'a']
selectors.forEach(selector => {
const elements = [...document.querySelectorAll(selector)] //convert node list to array
elements.forEach(el =>
el.textContent = el.textContent.replace(curses, filterStr))
})
如果愿意,可以使用ES5:
var curses = /the/ig;
var filterStr = '!@#$';
var selectors = ['p', 'h1', 'a'];
selectors.forEach( function(selector) {
var elements = document.querySelectorAll(selector);
elements = Array.prototype.slice.call(elements); //convert node list to array
elements.forEach( function(el) {
el.textContent = el.textContent.replace(curses, filterStr);
})
})
看看这个codepen来玩