我想做的是找到一个字符串中的所有匹配项,然后将它们包装在样式化的 span 标记中。我提出的解决方案使用递归,这是代码:
function foo(node, pattern) {
// alert(node.nodeValue);
// alert(node.nodeValue + '\n' + pattern.test(node.nodeValue));
if (pattern.test(node.nodeValue)) {
// alert(node.nodeValue);
var span = document.createElement('span');
var text = document.createTextNode(RegExp.rightContext);
span.className = 'someClass';
span.innerHTML = RegExp.$1;
node.nodeValue = RegExp.leftContext;
node.parentNode.insertBefore(span, node.nextSibling);
node.parentNode.insertBefore(text, span.nextSibling);
foo(text, pattern);
}
return;
}
在这个 fiddle 上查看它的实际效果:http://jsfiddle.net/Umcaf/
我遇到的问题是它不会标记出“测试”一词的所有实例。如果您尝试使用 alert 语句,您会注意到一些奇怪的行为(反正对我来说这很奇怪)。如果您取消注释第一个警报,您将看到我希望测试的所有正确字符串,但即使最后一个字符串中包含“测试”一词,pattern.test(node.nodeValue)
不产生“真”。这非常令人费解。
自然而然地,我想到了第二个警告语句。当使用第二个警告语句时,它会警告不正确的字符串(我的意思是它不会警告第一个完整的字符串并添加最后一个仅包含空格的字符串)并且第一次出现“测试”是'没有标记,但最后两个是!
我对正则表达式相当陌生,但我认为直到现在我对它们的理解已经足够好了。谁能解释这里发生了什么?
最佳答案
只需从正则表达式中删除 g,问题就消失了。
foo(node, /(test)/i);
您的正则表达式中有一个全局匹配标志。每次调用 test() 时它都会将指针向前推。
您可以在这里阅读更多内容:
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/RegExp/test
As with exec (or in combination with it), test called multiple times on the same global regular expression instance will advance past the previous match.
关于javascript - 为什么当我尝试针对正则表达式对其进行测试时字符串会消失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8687040/