首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >角- innerHTML,转义比字符少/大,但保持<br />不变

角- innerHTML,转义比字符少/大,但保持<br />不变
EN

Stack Overflow用户
提问于 2019-08-09 11:26:28
回答 2查看 2.1K关注 0票数 6

因此,我有一个具有显示解析的XML内容的表的角8应用程序,但是在某些情况下,字符串可以包含

需要解析为HTML的标记,但也需要以小于/大于符号的形式支持其他内容,例如。我使用innerHTML将它注入到一个标记中,但是这些带大括号的字符串被剪掉了。我试过像这样使用DomSanitizer:

代码语言:javascript
运行
复制
public sanitizeDsxText(text: any): any {
    return this.sanitizer.bypassSecurityTrustHtml(text);
}

但不幸的是,这也不起作用。有没有人面临过类似的问题,并能提供一个简单的解决方案?我会非常感激的:)

编辑:根据要求,更准确地说。我有一个这样的:

代码语言:javascript
运行
复制
<td class="dsx-table__cell" [innerHTML]="item.target?.txt">
</td>

"item.target?.txt“中的文本如下:"Cześć wam, tu bliźniaki dwa <br/> Paprika – siostra, brat <FAR/OFF>" *

  • 标签添加了空格,因为StackOverflow也在切割它们。

<bt/>被解析为正常的<br>标记,但是<FAR/OFF>被删除了--我需要找到一种方法来解析<br>,并将其他字符串保留在括号中而不是解析。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-14 10:46:56

结果不是太复杂就是不可能使用DomSanitizer,所以我们选择的解决方案是在后端对它进行不同的解析-

标签通常在JSON响应中返回,但是"<>“中的其他字符串都用HTML代替了它,并且它的工作方式也应该是这样的。

票数 0
EN

Stack Overflow用户

发布于 2021-07-27 09:10:42

我去派对迟到了。我已经创建了一个有角度的管道,它允许您有选择地允许标记,或者可以选择将它们转换为HTML实体。

下面是代码:

代码语言:javascript
运行
复制
import { Pipe, PipeTransform } from "@angular/core";
import { DomSanitizer } from "@angular/platform-browser";
import DOMPurify from "dompurify";

@Pipe({
  name: "safeHtml",
})
export class SafeHtmlPipe implements PipeTransform {
  constructor(private domSanitizer: DomSanitizer) {
    // How to securely allow target attribute
    // https://github.com/cure53/DOMPurify/issues/317
    DOMPurify.addHook("afterSanitizeAttributes", function (node: Element) {
      // set all elements owning target to target=_blank
      if ("target" in node) {
        (node as Element).setAttribute("target", "_blank");
        (node as Element).setAttribute("rel", "noopener");
      }
    });
  }

  transform(html: string, convertToEntity: boolean, additionalTags?: string[]): string {
    if (html.length > 0) {
      // we don't want tags such as `<input>` or any form elements
      // from being displayed, and at the same time allows certain
      // tags element for styling
      const sanitizeOptions = {
        FORBID_TAGS: ["script", "form", "input", "select", "textarea"],
        ADD_TAGS: ["b", "i", "em", "span"],
        ALLOW_UNKNOWN_PROTOCOLS: true,
        // NOTE: we enable this one if in case the addHook method has unexpected behavior
        // ADD_ATTR: ["target"],
      };

      if (additionalTags && additionalTags.length) {
        sanitizeOptions.ADD_TAGS.push(...additionalTags);
      }

      let sanitizedContent = html;

      if (convertToEntity) {
        sanitizedContent = this.escapeHtml(html);
      } else {
        sanitizedContent = DOMPurify.sanitize(html, sanitizeOptions);
      }

      return this.domSanitizer.bypassSecurityTrustHtml(sanitizedContent) as string;
    }

    return html;
  }

  private escapeHtml(str: string): string {
    // DOMSanitizer or DOMPurify doesn't have options to convert special characters
    // to html entities
    return str
      .replace(/&/g, "&amp;")
      .replace(/</g, "&lt;")
      .replace(/>/g, "&gt;")
      .replace(/"/g, "&quot;")
      .replace(/'/g, "&#039;");
  }
}

用法:

  • 允许imga标记
代码语言:javascript
运行
复制
<div class="modal-body" [innerHTML]="message | safeHtml: false:['img', 'a']"></div>
  • 通过将特殊字符转换为等效的HTML实体来转义字符串。用于将代码显示为字符串,而不必担心XSS。
代码语言:javascript
运行
复制
<p [innerHTML]="content | safeHtml: true"></p>
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57429062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档