我在这段代码中有一个我似乎无法解决的错误。如果只有一个Act实例,它就可以正常工作。但是当有超过1个Act的实例时,它会中断。不知道我在这里缺少什么。
//Find all instances of italics
var findItalics = new RegExp(/(<em>.*?<\/em>)/g);
var italicsArray = [];
var italicCount;
while (italicCount = findItalics.exec(searchInput)) {
italicsArray.push(italicCount[0]);
}
//Find the italics containing the word 'Act'
var keywordItalics = new RegExp(/<em>.*?(Act).*?<\/em>/g);
var keywordItalicArray = [];
var italicCountKeyword;
while (italicCountKeyword = keywordItalics.exec(italicsArray)) {
keywordItalicArray.push(italicCountKeyword[0]);
}
//Remove all instances of the keyword(s)
for (var tlcs = italicsArray.length - 1; tlcs >= 0; tlcs--) {
if(italicsArray[tlcs] == keywordItalicArray) {
italicsArray.splice(tlcs, 1);
}
}
答案 0 :(得分:0)
感谢@artgb帮助我重新思考这个问题。
//Find all instances of italics
var findItalics = new RegExp(/(<em>.*?<\/em>)/g);
var italicsArray = [];
var italicCount;
while (italicCount = findItalics.exec(searchInput)) {
italicsArray.push(italicCount[0]);
}
//Find the italics containing the word 'Act'
var keywordItalics = new RegExp(/<em>.*?(Act).*?<\/em>/g);
var keywordItalicArray = [];
var italicCountKeyword;
while (italicCountKeyword = keywordItalics.exec(searchInput)) {
keywordItalicArray.push(italicCountKeyword[0]);
}
//Remove all instances of the keyword(s)
for(var xXx = 0; xXx < keywordItalicArray.length; xXx++){
for (var tlcs = italicsArray.length - 1; tlcs >= 0; tlcs--) {
if(italicsArray[tlcs] == keywordItalicArray[xXx]) {
italicsArray.splice(tlcs, 1);
}
}
}
答案 1 :(得分:0)
var keywordItalics = new RegExp(/<em>.*?(Act).*?<\/em>/g);
通常应缩短为:
var keywordItalics = /<em>.*?(Act).*?<\/em>/g;
你的()所在的地方,只会捕获&#34; Act&#34;,所以要捕获em中的整个字符串,它应该是:
var keywordItalics = /<em>(.*?Act.*?)<\/em>/g;
然而,更快的方法(没有正则表达式)你可以得到所有强调标签的数组:
var keywordItalics = document.getElementsByTagName('em');
如果您只是试图摆脱所有包含&#34; Act&#34;的所有人,您只需要:
document.body.innerHTML = document.body.innerHTML.replace(
/<em>.*?Act.*?<\/em>/g,
''
);
这应该删除包含&#34; Act&#34;的所有痕迹。在文档中(有效地用空字符串替换那些字符串,也就是没有)。然而,它会引起回流。如果它们在除了body之外的包含元素内部,最好先获取包含元素(而不是使用body)。有更好的&#34;这样做的方法,但这可能是最简单的编码方式。
更新:使用&#34; Act&#34;删除em的简单方法从数组将是:
italicsArray = italicsArray
.join('_SEP_') // Convert to string
.replace(/<em>.*?Act.*?<\/em>/g,'') // Delete matched entries
.replace(/(_SEP_)+/g,'_SEP_') // Collapse multiple seperators
.split('_SEP_') // Convert back to array
;
这基本上使用了分隔符_SEP_
(以避免与包含&#39;的字符串冲突)并将数组转换为字符串,删除所有与正则表达式匹配的内容,删除未定义的内容条目,并以相同的名称重新创建数组。