Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript正则表达式忽略div span标记_Javascript_Html_Regex_Regex Group - Fatal编程技术网

Javascript正则表达式忽略div span标记

Javascript正则表达式忽略div span标记,javascript,html,regex,regex-group,Javascript,Html,Regex,Regex Group,我有下面的文字 是一个 我想把an改成a,我使用下面的正则表达式模式来实现这一点 const regExFinder = new RegExp("an", 'gi'); const sourceHTML = "<span> is an </span>"; sourceHTML.replace(regExFinder, `$&`); 常量regExFinder=newregexp(“an”,“gi”); const sourceHTML=“是一个”; replac

我有下面的文字

是一个

我想把an改成a,我使用下面的正则表达式模式来实现这一点

const regExFinder = new RegExp("an", 'gi');
const sourceHTML = "<span> is an </span>";
sourceHTML.replace(regExFinder, `$&`);
常量regExFinder=newregexp(“an”,“gi”); const sourceHTML=“是一个”; replace(regExFinder,`$&`); 但是输出是这样的。有谁能告诉我如何忽略任何标记,只更改标记内的文本

<spa> is a </spa>
是一个
如果我的源HTML如下所示:

<div> an <span> is an </span></div>
an是一个

您可以检查此解决方案。我已经从字符串中删除了所有html标记,然后应用了替换操作。它将适用于您的两个测试用例

常量regExFinder=newregexp(“an”,“gi”); 让sourceHTML=“an是一个”; sourceHTML=sourceHTML.replace(/]*>?/gm',).trim();//删除HTML标记 sourceHTML=sourceHTML.replace(regExFinder,'a');
log(sourceHTML)您有两个选项

const str = "<div> an <span> is an </span></div>";
// method 1: negative lookaheads (probably the best for regex)
str.replace(/an(?![^<>]*>)/gi, "a");
// method 2: rely on having a space after the "an" (not reliable)
str.replace(/an /gi, "a ")
// method 3: rely on "an" being its own word (depends on the situation)
str.replace(/\ban/gi, "a")
const str=“an是一个”;
//方法1:负外观heads(可能最适合正则表达式)
str.replace(/an(?![^]*>)/gi,“a”);
//方法2:依靠“安”后有一个空格(不可靠)
str.replace(/an/gi,“a”)
//方法三:依靠“安”字(视情况而定)
str.replace(/\ban/gi,“a”)

我将整个字符串解析为一个DOM元素,然后遍历所有span元素,将其内容从“an”更改为“a”,正则表达式中的元字符
\b
表示单词边界

编辑:

在深入挖掘之后,我现在可以操作所有文本节点并更改相关字符串:

var html='an是一个苹果,这是一个香蕉';
var b=document.createElement('body');
b、 innerHTML=html;
//使用“可选过滤器功能”进行更改:
getTextNodesIn(b,n=>n.textContent=n.textContent.replace(/\ban\b/g,'a'));
//输出:
log(b.innerHTML);
//我刚刚意识到我也可以使用Chris West的原始功能:
// https://cwestblog.com/2014/03/14/javascript-getting-all-text-nodes/
函数getTextNodesIn(elem,opt_fnFilter){
var textNodes=[];
if(elem){
对于(var nodes=elem.childNodes,i=nodes.length;i--;){
var node=nodes[i],nodeType=node.nodeType;
if(节点类型==3){
if(!opt_fnFilter | | opt_fnFilter(节点,元素)){
textNodes.push(节点);
}
}
else if(节点类型==1 | |节点类型==9 | |节点类型==11){
textNodes=textNodes.concat(getTextNodesIn(node,opt_fnFilter));
}
}
}
返回文本节点;

}
不应使用regexp操作HTML代码。使用DOM模型,对实际的
元素进行操作。有没有代码示例来说明如何执行此操作?我想他正在寻找替换所有“an”的方法,而不仅仅是替换span中的那些。是的,我的代码片段将只对
标记中的文本部分进行操作。