Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/82.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 对元素中的所有文本应用正则表达式_Javascript_Html_Regex_Replace - Fatal编程技术网

Javascript 对元素中的所有文本应用正则表达式

Javascript 对元素中的所有文本应用正则表达式,javascript,html,regex,replace,Javascript,Html,Regex,Replace,我试图使用JS动态地用特定HTML元素中的链接替换特定单词。我想我应该使用一个简单的正则表达式: var regEx = new RegExp('\\b'+text+'\\b', 'gi'); 在context div的innerHTML属性上应用RegEx replace的快捷方式: context.innerHTML = context.innerHTML.replace(regEx, '<a href="#">'+text+"</a>"); 有人能看出我做错了什

我试图使用JS动态地用特定HTML元素中的链接替换特定单词。我想我应该使用一个简单的正则表达式:

var regEx = new RegExp('\\b'+text+'\\b', 'gi');
在context div的
innerHTML
属性上应用RegEx replace的快捷方式:

context.innerHTML = context.innerHTML.replace(regEx, '<a href="#">'+text+"</a>");
有人能看出我做错了什么,或者能想出更好的解决办法吗?谢谢

更新: 以下是
context
内容的一个片段:

<h4>Newton's Laws of Motion</h4>
<p><span class="inline_title">Law No.1</span>: <span class="caption">An object at rest will remain at rest, and an object in motion will continue to move at constant velocity, unless a net force is applied.</span></p>
<ul>Consequences: <li>Conservation of Momentum in both elastic and inelastic collisions</li>
<li>Conservation of kinetic energy in elastic collisions but not inelastic.</li>
<li>Conservation of angular momentum.</li>
</ul>
<h5>Equations</h5>
<p class="equation">&rho; = mv</p>
<p>where &rho; is the momentum, and m is the mass of an object moving at constant velocity v.</p>
牛顿运动定律 第一定律:静止的物体将保持静止,运动的物体将继续以恒定速度运动,除非施加净力

    结果:
  • 弹性和非弹性碰撞中的动量守恒
  • 弹性碰撞中的动能守恒,但不是非弹性的
  • 角动量守恒
方程

&rho;=mv

where&rho;是动量,m是以恒定速度v运动的物体的质量


根据我的理解,您试图替换
innerHTML
中的文本,但在
标记中

首先,我尝试使用
innerText
而不是
innerHTML
,但它没有给出expexted结果。后来我发现了一个@Alan Moore's,带有
负前瞻正则表达式

(?![^<>]*>)
(?![^]*>)
可用于忽略标记中的文本
。这是我的方法

var regEx = new RegExp("(?![^<>]*>)" + title, 'gi');
context.innerHTML = context.innerHTML.replace(regEx, '<a href="#">'+text+"</a>");
var regEx=newregexp(“(?![^]*>)”+标题“gi”);
context.innerHTML=context.innerHTML.replace(regEx,“”);
这是一个示例,您可以使用它:

function replaceText(context, regEx, replace)
{
    var childNodes = context.childNodes;
    for (var i = 0; i<childNodes.length; i++) {
        var childNode = childNodes[i];
        if (childNode.nodeType === 3) // 3 is for text node
            childNode.nodeValue = childNode.nodeValue.replace(regEx, replace);
        else if (childNode.nodeType === 1 && childNode.nodeName != "HEAD")
            replaceText(childNode, regEx, replace); 
    }
}
replaceText(context, /cons/ig, 'GROUIK!');
函数replaceText(上下文、正则表达式、替换)
{
var childNodes=context.childNodes;

对于(var i=0;你能显示你的HTML吗?你不应该用正则表达式来做那部分。最好缩小循环中节点的内容,只缩小它的内容,不包括子节点。@PraveenJeganathan这没什么特别的,只是一个包含一堆和图像的div…@Allendar你是什么意思?@Sean what
context
有效?如果你设置了一个提琴,我会容易得多。非常感谢!这很有效,但仍然存在一个问题:不能用标记替换字符串,因为它不会被解释…因为你使用的是作用于文本节点的
nodeValue
属性。这是一个我起初没有认识到的问题。谢谢h为你的答案!这非常有效,尽管这个级别的regexp远远超出了我的知识范围。你能想出一种排除特定标记的方法吗?例如,我不想在另一个链接中添加链接。。。
function replaceText(context, regEx, replace)
{
    var childNodes = context.childNodes;
    for (var i = 0; i<childNodes.length; i++) {
        var childNode = childNodes[i];
        if (childNode.nodeType === 3) // 3 is for text node
            childNode.nodeValue = childNode.nodeValue.replace(regEx, replace);
        else if (childNode.nodeType === 1 && childNode.nodeName != "HEAD")
            replaceText(childNode, regEx, replace); 
    }
}
replaceText(context, /cons/ig, 'GROUIK!');