【问题标题】:How can I filter out all other tags other than b, u and i when trying to render content using .innerHTML尝试使用 .innerHTML 呈现内容时,如何过滤除 b、u 和 i 之外的所有其他标签
【发布时间】:2021-06-15 09:40:21
【问题描述】:

我正在使用 textarea 收集表单中的文本,并计划使用 .innerHTML 呈现该文本,以便用户可以将内容设置为粗体、斜体和下划线。我可能会决定增加灵活性以允许使用样式属性的彩色文本。

我曾考虑使用正则表达式来匹配文本,但我希望有一个更优雅的解决方案。

这是我目前拥有的

      <div class="fullblog-container">
        <textarea name="title" id="fullblogTitle"></textarea>
      </div>
      <button class="addBlock" onclick="submitBlocks()">SUBMIT</button>
       const fullBlogContainer = document.querySelector(".fullblog-container");
      function submitBlocks() {
        const allChildren = Array.from(fullBlogContainer.children);
        const filterChildren = allChildren.filter((elem) => elem.tagName != "BUTTON");
        console.log(filterChildren[0].value);
      }

上面的代码从我所有的textarea(目前只有1个textarea)获取输出。

我计划使用.innerHTML 渲染该值,并希望保留 b、u、i 标记和可能带有样式属性的 div 标记,并将其余部分视为文本。

编辑:虽然我的问题导致防止注入攻击(存在类似问题),但我需要一种方法将某些部分呈现为文本,将其他部分呈现为 html,但我还没有找到合适的解决方案。

PS:请不要使用 JQuery

【问题讨论】:

  • @evolutionxbox 我需要一种方法将特定部分呈现为文本,其余部分呈现为 html,所以我认为这不能回答我的问题。
  • @jabaa 对于具有样式属性的 div 标签,我该怎么做? ... 未来。
  • 我不明白为什么我会投票失败,我已经完成了我的研究,但没有找到任何合适的方法来完成这项任务。我也没有看到任何类似的 StackOverflow 问题。
  • 请您向我们展示您自己代码的输入、当前输出以及所需的输出?确保它是minimal reproducible example

标签: javascript html dom


【解决方案1】:

一种方法是将所有元素转换为您希望允许的文本和白名单元素。使用innerText,浏览器将所有html 实体转换为它们的代码。然后您可以使用innerHTML 阅读实际代码并替换列入白名单的元素。

const dangerousContent = '\<script\>dangerousFunction()\</script\>';
const content = 'Text \<b\>bold\</b\> \<i\>italic\</i\>  \<u\>underline\</u\>';

const container = document.getElementById('container');

container.innerText += dangerousContent;
container.innerText += content;
container.innerHTML = container.innerHTML
                               .replace(/&lt;b&gt;/g, '\<b\>')
                               .replace(/&lt;\/b&gt;/g, '\</b\>')
                               .replace(/&lt;i&gt;/g, '\<i\>')
                               .replace(/&lt;\/i&gt;/g, '\</i\>')
                               .replace(/&lt;u&gt;/g, '\<u\>')
                               .replace(/&lt;\/u&gt;/g, '\</u\>');
&lt;span id="container"&gt;&lt;/span&gt;

【讨论】:

  • 如何允许带有样式属性的 div 标签?很抱歉我以前从未使用过正则表达式。
  • @rishi 我会考虑 div 但这并不是那么简单。首先,您必须找到仅包含样式的 div。这可以通过正则表达式来完成。然后你必须找到相应的结束标签。正则表达式无法实现的 AFAIK。
  • 啊,好吧,所以也许一个可能的解决方案是寻找类似&lt;red&gt; 的东西并用&lt;span style="color: red"&gt; 替换它?这会是一个合适的解决方案吗? ...它也会让用户更轻松。
  • @rishi 是的,这可以像替换其他标签一样实现。但请记住,span、div 和所有其他标签都可能包含恶意代码:jsfiddle.net/2ms4jyax/4 清理内容。
  • 太棒了,谢谢,我会接受这个答案。这是一个很好的答案,但我最初希望没有正则表达式的东西(但也许我希望太多:))。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-05
  • 1970-01-01
相关资源
最近更新 更多