正确渲染html字符串

本文介绍了一种安全渲染HTML字符串的方法,通过将尖括号转义为HTML实体,确保只有合法的HTML标签被正确渲染,避免了潜在的安全风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

正确渲染html字符串

前言

在渲染 html 字符串时,需要将合法的 html 标签渲染出来,对部分字符( <> )转义成 html 实体。

相关链接

最全面清除html字符串的方式

代码

var str = `111<br     />sdfsdfsdf<h1 class="ddd"> 哈哈哈</h1>请看题()。i=0,s=0;while (s<n) {s=s+i;i++;}<br>else:<br   >    print 2<p >段落1</p><p>段落2</p>`
// 将 <、> 转义成 html 实体
function htmlSelfEncode (str) {
  if (typeof str !== 'string') {
    return ''
  }
  let s = ''
  if (str.length === 0) {
    return s
  }
  s = str.replace(/</g, '&lt;')
  s = s.replace(/>/g, '&gt;')
  return s
}
// 渲染 html 字符串
function renderHtml (str) {
  if (typeof str !== 'string') {
     return ''
   }
   const regPre = /<\/?[a-zA-Z]+[1-9]?\s*(\s+[a-zA-Z]+=("[^</>]*"|'[^</>]*'|[^</>]*))*\/?>/g
   const arrPre = str.match(regPre) || []
   let resultArr = []
   arrPre.forEach((v, i) => {
     let index = str.indexOf(v)
     let temp = str.substring(0, index)
     resultArr.push(this.htmlSelfEncode(temp), v)
     str = str.substring(index + v.length)
   })
   resultArr = resultArr.filter(v => v)
   return resultArr.join('')
}
renderHtml(str) // "111<br     />sdfsdfsdf<h1 class="ddd"> 哈哈哈</h1>请看题()。i=0,s=0;while (s&lt;n) {s=s+i;i++;}<br>else:<br   >    print 2<p >段落1</p><p>段落2</p>"
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>渲染html字符串</title>
  <style>
    .render-html{
      border: 1px solid #BBBFCD;
      padding: 20px;
      margin-bottom: 20px;
    }
  </style>
</head>
<body>
  <div>
    <h1>原始字符串</h1>
    <div id="pre" class="render-html"></div>
    <h1>转义 &lt;&gt; 为 html 实体后</h1>
    <div id="next" class="render-html"></div>
  </div>
  <script>
    var str = `111<br     />sdfsdfsdf<h1 class="ddd"> 哈哈哈</h1>请看题()。i=0,s=0;while (s<n) {s=s+i;i++;}<br>else:<br   >    print 2<p >段落1</p><p>段落2</p>`
    // 将 <、> 转义成 html 实体
    function htmlSelfEncode (str) {
      if (typeof str !== 'string') {
        return ''
      }
      let s = ''
      if (str.length === 0) {
        return s
      }
      s = str.replace(/</g, '&lt;')
      s = s.replace(/>/g, '&gt;')
      return s
    }
    // 渲染 html 字符串
    function renderHtml (str) {
      if (typeof str !== 'string') {
	      return ''
	    }
	    const regPre = /<\/?[a-zA-Z]+[1-9]?\s*(\s+[a-zA-Z]+=("[^</>]*"|'[^</>]*'|[^</>]*))*\/?>/g
	    const arrPre = str.match(regPre) || []
	    let resultArr = []
	    arrPre.forEach((v, i) => {
	      let index = str.indexOf(v)
	      let temp = str.substring(0, index)
	      resultArr.push(this.htmlSelfEncode(temp), v)
	      str = str.substring(index + v.length)
	    })
	    resultArr = resultArr.filter(v => v)
	    return resultArr.join('')
    }
    const pre = document.querySelector('#pre')
    const next = document.querySelector('#next')
    pre.innerHTML = str
    next.innerHTML = renderHtml(str)
    console.log(str)
    console.log(renderHtml(str))
  </script>
</body>
</html>

总结

将尖括号转义为 html 实体,并且不转义合法的 html 字符串,可以使用上面的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值