我不熟悉JavaScript和HTML。但我尝试使用JavaScript实现一个函数。
我想替换html页面中所有的<em>
和</em>
,所以我在页面中插入了一段javascript代码:
function rep()
{
document.body.innerHTML
= document.body.innerHTML
.replaceAll("<em>", "_");
document.body.innerHTML
= document.body.innerHTML
.replaceAll("</em>", "_");
}
window.onload=rep()
<!DOCTYPE html>
<html lang="en">
<!-- ... -->
<article>
<div class="container">
<div class="row">
<div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1 post-container">
<p>(Weierstrass) 设 $z_{0}$ 是 $f$ 的本性奇点,那么对任意 $A \in \mathbb{C}<em>{\infty}$, 必存在趋于 $z</em>{0}$ 的点列 $\left{z_{n}\right}$, 使得 $\lim <em>{n \rightarrow \infty} f\left(z</em>{n}\right)=A$.</p>
</div>
</div>
</div>
<!-- ... -->
</html>
成功地将<em>
替换为"_",但是所有的</em>
都没有改变。代码有什么问题吗?谢谢!
4条答案
按热度按时间j0pj023g1#
让我们看看当浏览器看到无效的html时会发生什么:
x一个一个一个一个x一个一个二个x
上面的代码打印
test
(和脚本)这是因为浏览器在解析时会去除无效的结构
当你这样做
正确替换了所有
<em>
标记,但删除了结束标记这将在另一方面起作用:
kognpnkq2#
为此,使用可用的DOM方法可能更好。
1.用
querySelectorAll
拾取所有em
元素。1.为每个元素创建一个文本节点。用下划线将元素的原始文本内容添加到文本节点中。使用
replaceWith
将em
元素替换为文本节点。其他文件
querySelectorAll
forEach
t5zmwmid3#
用正则表达式或字符串函数处理HTML是个坏主意(HTML不是字符串),但如果一定要这样做,应该这样做:
换句话说,不要使用部分处理的字符串来设置
innerHTML
。4uqofj5v4#
更简单但效率不高:
结果:
正则表达式将遍历整个正文,并将所有
<em>
或</em>
替换为_
正则表达式选项
g
用于全局,m
用于多行,允许覆盖整个正文和多次出现。