DOMPurify - 如何保留已删除(不需要的)span 标签中包含的(子)强标签?

问题描述 投票:0回答:1

我使用 DOMPurify 库 (https://github.com/cure53/DOMPurify) 来清理从 google 文档复制的 html 代码。

我想从复制的文本中删除跨度标签,但保留标签内的文本以及删除的跨度标签中包含的任何强标签。

我设法删除跨度标签,同时将文本保留在标签内,但任何强标签也会被删除。

示例

DOMPurify.sanitize("<p>
<span style="background-color:transparent;color:#000000;"><strong>Some strong text</strong></span>
</p>", {
    ALLOWED_TAGS: ['p','strong']
})

输出

<p>Some strong text</p>

预期产量

<p><strong>Some strong text</strong></p>

我也尝试过这种挂钩

DOMPurify.addHook("afterSanitizeAttributes", function (node, data, config) {
  if (node.nodeName === "SPAN") {
    node.replaceWith(node.textContent ?? "");
  }
});

但是输出是一样的,

<strong>
里面的
<span>
标签也被删除了。

你能帮我在“消毒”之后保留(子)

<strong>
标签吗?

非常感谢

javascript dompurify
1个回答
0
投票

首先,你的代码确实有效。

但解决方法是将所有

<strong>
替换为
[strong]
,净化,然后替换回来。您可以添加逻辑来预先检查字符串是否包含
[strong]
以使其稳健。我会假设它不存在。

function replaceStrong(text) {
  return text.replace(/<\/?strong>/gi, match =>
    match.startsWith('</') ? '[/strong]' : '[strong]'
  )
}

function restoreStrong(text) {
  return text.replace(/\[\/?(strong)\]/g, match =>
    match.startsWith('[/') ? '</strong>' : '<strong>'
  )
}

function myPurify(html) {
  var stronger = replaceStrong(html)
  var replaced = DOMPurify.sanitize(stronger, {
    ALLOWED_TAGS: ['p', 'strong']
  })
  return restoreStrong(replaced)
}

var result = myPurify(`<p>
  <span style="background-color:transparent;color:#000000;"><strong>Some strong text</strong></span>
</p>`)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/dompurify/3.1.7/purify.js" integrity="sha512-QrJgumdAGShrxG5uB7fPRQmjs4cQU6FJee9lspckHT6YYwpilnoUuj2+v5L29mmA/kvLQBjkphsROlRPjtC61w==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

© www.soinside.com 2019 - 2024. All rights reserved.