为什么RegEx输出转义文本而不是HTML
Why does RegEx output escaped text instead of HTML
我正在编写一个Chrome扩展,它在与某个正则表达式匹配的每个字符串周围添加一个<span> ... </span>
。RegEx匹配非常有效,但我似乎找不到在文本周围正确添加span
标记的方法。
到目前为止,我的代码是:
// main.js
var regex_pattern = new RegEx('(apple)', 'g'); // Let's pretend I want to match every instance of 'apple'
var textNodes = getTextNodes(); // A function that returns a list of every text node from the DOM
for (var i = 0; i < textNodes.length; i++) {
if (textNodes[i].nodeValue.match(regex_pattern)) {
textNodes[i].nodeValue = textNodes[i].nodeValue.replace(regex_pattern, "<span class='highlight'>$&</span>");
}
}
这将正确识别RegEx模式(在本例中为"apple")的每个匹配项,并输出<span class="highlight">apple</span>
。唯一的问题是,Chrome不将其视为HTML,而是将其视为由文本处理——因此,与其看到根据highlight
类设计的世界"苹果",不如看到文字输出:<span class="highlight">apple<span>
为什么会发生这种情况,以及如何修复它以便正确应用样式?意识到这不太理想,我尝试使用insertBefore()
方法将匹配的文本包装在一个跨度中,但这没有任何作用,它会出错或无法添加span
节点,这取决于我如何调整代码。感谢您提供的任何见解!
不能使用nodeValue
将文本节点替换为任意HTML。
您必须手动操作:
function replaceNodeWithHTML(node, html) {
var parent = node.parentNode;
if(!parent) return;
var next = node.nextSibling;
var parser = document.createElement('div');
parser.innerHTML = html;
while(parser.firstChild)
parent.insertBefore(parser.firstChild, next);
parent.removeChild(node);
}
var regex_pattern = /(apple)/g;
var textNodes = [document.querySelector('div').firstChild];
for (var i = 0; i < textNodes.length; i++)
if (textNodes[i].nodeValue.match(regex_pattern))
replaceNodeWithHTML(
textNodes[i],
textNodes[i].nodeValue.replace(regex_pattern, "<span class='highlight'>$&</span>")
);
.highlight {
background: yellow;
}
<div>I have an (apple). You have an (apple) too.</div>
如果节点有insertAdjacentHTML
方法,但只有元素有,则会更容易。
在元素上设置.innerHTML。设置textNode.nodeValue值直接设置文本。
相关文章:
- 用JavaScript替换Android WebView模板上的html文本
- 仅IE8 html文本框中的字符
- HTML文本框中的javascript数字
- HTML文本输入大小
- 如何放置ÅÄ和#214;在javascript数组中,然后将其与html文本进行比较
- 如何以非编程方式国际化HTML文本
- 在 PHP 块中使用 Javascript 设置 HTML 文本框的值(使用 echo)
- jQuery在用新文本替换HTML文本时淡出HTML文本,而不是仅显示
- HTML文本框,它接受电话号码,并以美国电话号码格式显示
- Javascript按钮,在html文本区域中插入一个大黑点(•)
- 更换163;使用javascript从html文本区域中提取字符
- 单击或点击切换HTML文本
- 单击即可编辑HTML文本
- 分析Adobe InDesign的HTML文本——其他标记中的标记
- 如何将mysql查询的结果获取到html文本框中
- 当使用javascript/jquery添加值时,html文本输入表显示不正确
- 如何将 HTML 文本同步并突出显示到音频
- 如何使用 JQuery 从相对元素获取 html 文本
- 根据用户选择的输入编写 html 文本
- MVC 4:使用 JQUERY 和 PartViewResult 动态创建 HTML 文本框.如果代码是动态添加的,如何