【发布时间】:2014-03-20 16:23:36
【问题描述】:
我正在获取页面上包含“em”的每个文本节点
然后我将文本节点的父节点的 html(即文本)替换为新的 HTML。
在您的控制台上尝试以下代码。它应该突出显示当前页面上的所有“em”文本。
但事实并非如此。相反,它弄乱了整个页面。我做错了什么?
我认为 :contains 寻找文本节点,而不是 HTML。
var someString = "em";
$(':contains("' + someString + '")').each(function ()
{
var oldHTML = $(this).html();
var regex = new RegExp(someString, "g");
var newHTML = oldHTML.replace(regex, '<span style="background-color: yellow;">' + someString + '</span>');
$(this).html(newHTML);
});
很抱歉,我无法为我的奇怪问题找到更直观的标题 - 如果可以,请随时更改它! :)
谢谢!
编辑:
原来我的 .replace(...) 也在替换 html 标签,而不仅仅是纯文本。
我应该一直在做类似的事情(虽然我不确定这是正确的正则表达式):
var regex = new RegExp("<.*>(" + someString + ")\/.*>", "g");
var newHTML = oldHTML.replace(regex, '<span style="background-color: yellow;">' + someString + '</span>');
【问题讨论】:
-
似乎对我有用。 jsfiddle.net/zUMB9。你的 html 是什么样的?
-
jsfiddile 不可靠,因为它从未处于“真实条件”下 - 在我们现在所在的页面上尝试一下。打开浏览器的控制台并运行代码。
-
这是因为您不只是在寻找纯文本。你不想要 html 元素。
-
哦,我明白了 - 我的替换功能还包含 html 标签,而不仅仅是纯文本 - 该死的你是对的!谢谢! :) 如果我能想出一个只会替换纯文本的正则表达式,那就太酷了..让我们看看..
-
为此使用正则表达式真的很丑陋。您可以使用完整的 DOM API,它允许您直接定位文本节点。为什么不利用它。 DOM 毕竟不是字符串。它是对象的层次结构。您的
:contains选择将为您提供每次出现的文本字符串的所有祖先,包括body和documentElement。
标签: javascript jquery html regex replace