【发布时间】:2019-07-13 02:44:45
【问题描述】:
我有以下 HTML 代码:
<span class="whatever-class custom-class-name" attribute="Whatever 1 AAA">AAA BBB</span>
<span class="search-text custom-class-name" attribute="Whatever 2 AAA">Text AAA</span>
我想替换跨度标记之间的文本,但前提是跨度标记具有类“search-text”。所以在我的例子中,我有一个包含两个跨度的 HTML 代码的字符串。如果第二个跨度包含搜索到的文本,我想替换它。
我搜索:“aa”,我想用<span class="highlight-text">aa</span> 替换它。所以最终的结果应该是:
<span class="whatever-class custom-class-name" attribute="Whatever 1 AAA">AAA BBB</span>
<span class="search-text custom-class-name" attribute="Whatever 2 AAA">Text <span class="highlight-search">AA</span>A</span>
现在我正在做类似的事情:
var paint = $.proxy(this._paint, this);
var regex = /(<span class="search-text[^>]+>|<\/span>)/g;
item.node.innerHTML = item.html.replace(regex, paint);
其中“value”是:“aa”和“item.html”是我的问题开头显示的 HTML。
_paint 函数:
_paint: function($0) {
return '<span class="highlight-text">' + $0 + '</span>';
},
此时结果是第二个跨度完全包裹在 '<span class="highlight-text">' + $0 + '</span>'; 中。结果如下:
<span class="whatever-class custom-class-name" attribute="Whatever 1 AAA">AAA BBB</span>
<span class="highlight-text"><span class="search-text custom-class-name" attribute="Whatever 2 AAA">Text AAA</span></span>
我只想将文本匹配包含在 hghlight 范围内,如下所示:
<span class="whatever-class custom-class-name" attribute="Whatever 1 AAA">AAA BBB</span>
<span class="search-text custom-class-name" attribute="Whatever 2 AAA">Text <span class="highlight-text">AA</span>A</span>
有什么想法吗?谢谢。
【问题讨论】:
-
最好的办法是创建一个文档片段,将 HTML 文本放入其中,然后使用普通的 DOM API 来查找和操作 HTML。使用正则表达式处理 HTML 是一团糟。
-
如果这是已经页面代码,那么您可能甚至不需要文档片段。否则,如果你有一个 HTML 字符串,那么你可以这样做。正则表达式会丑。如果
search-text是 second 类怎么办?还是第三?如果class属性甚至不是元素中的第一个属性怎么办? -
我不是在操作 DOM,我已经有一个包含所有项目的数组。该数组包含项目文本和项目 html。
-
将它们转换为文档片段并在其上使用 DOM 工具可能仍然比尝试针对 HTML 允许的许多可能变化进行正则表达式更容易。但是,如果您显示该数组,以便我们可以看到您实际使用的是什么,您可能会得到更好的答案
标签: javascript jquery regex regexp-replace