angularjs 输出纯文本而不是 html

IT技术 javascript html angularjs
2021-01-14 07:45:53

我有一些这样的文字:

<span>My text</span>

我想不带标签显示:

My text

我也不想应用标签,我想剥离它们。有什么简单的方法可以做到这一点?

角HTML:

<div>{{myText | htmlToPlaintext}}</div>
6个回答

jQuery 大约是 SLOWER 的 40 倍,请不要将 jQuery 用于这个简单的任务。

function htmlToPlaintext(text) {
  return text ? String(text).replace(/<[^>]+>/gm, '') : '';
}

用法 :

var plain_text = htmlToPlaintext( your_html );

使用 angular.js :

angular.module('myApp.filters', []).
  filter('htmlToPlaintext', function() {
    return function(text) {
      return  text ? String(text).replace(/<[^>]+>/gm, '') : '';
    };
  }
);

利用 :

<div>{{myText | htmlToPlaintext}}</div>  
我实际上更喜欢 String(text).replace(/<[^>]+>/gm, '')。我已经使用它多年没有任何问题。
2021-03-14 07:45:53
您可能应该在那里添加一个空检查,否则它会输出“空”: return text ? String(text).replace(/<[^>]+>/gm, '') : "";
2021-03-20 07:45:53
我永远不会仅仅为了将 html 转换为文本而添加 jQuery 依赖项,但是如果我的项目已经使用了 jQuery,我会选择 jQuery 解决方案,因为我认为自定义编写的正则表达式可读性较差、测试较少且可靠性较低。您的正则表达式是否可以抵御所有可能的 XSS 形式
2021-03-27 07:45:53
jQuery 慢了 40 倍,但你仍然可以获得 8000 ops/s,所以因为这个原因不使用 jQuery 是过早的优化。
2021-03-31 07:45:53
使用 DOM 引擎涵盖了更多的情况,这个简单的替换了那些不是示例:这里的一些代码 ’ “ ”
2021-04-04 07:45:53

来自https://docs.angularjs.org/api/ng/function/angular.element

角元素

将原始 DOM 元素或 HTML 字符串包装为 jQuery 元素(如果 jQuery 不可用,则 angular.element 委托给 Angular 的内置 jQuery 子集,称为“jQuery lite”或“jqLit​​e”。)

所以你可以这样做:

angular.module('myApp.filters', []).
  filter('htmlToPlaintext', function() {
    return function(text) {
      return angular.element(text).text();
    }
  }
);

用法:

<div>{{myText | htmlToPlaintext}}</div>
我建议将您的文本包装在一个元素中,否则像“hi”这样的普通旧字符串将返回一个空字符串 angular.element('<div>'+text+'</div>').text();
2021-03-26 07:45:53
如何显示预览,而不是显示纯文本(它正在工作)。但我需要在发布问题或答案(包括图像)时显示堆栈溢出显示等预览
2021-03-28 07:45:53
如果您在指令的链接功能中,您可以简单地执行 element.text() 0.o
2021-04-04 07:45:53
我也会避免这种方法;可能不会像完整的 jQuery 一样长,但肯定比接受的答案慢得多。
2021-04-07 07:45:53
与使用正则表达式相比,我更喜欢这个解决方案,至少在速度不重要的情况下。它更正确,实际上会将 html 转换为纯文本,额外地少于符号、特殊实体等等。
2021-04-11 07:45:53
var app = angular.module('myapp', []);

app.filter('htmlToPlaintext', function()
{
    return function(text)
    {
        return  text ? String(text).replace(/<[^>]+>/gm, '') : '';
    };
});

<p>{{DetailblogList.description | htmlToPlaintext}}</p>
如何显示预览,而不是显示纯文本(它正在工作)。但我需要在发布问题或答案(包括图像)时显示堆栈溢出显示等预览
2021-03-21 07:45:53
应该被否决的低质量答案和应该删除的非答案之间存在差异。请参阅你做错了:低质量帖子队列中的理智请求
2021-03-23 07:45:53
在代码中添加一些格式和一些见解,这有助于生成更好的答案。
2021-04-06 07:45:53
请添加一些解释。您的回答目前被标记为“低质量”,最终可能会被删除。
2021-04-13 07:45:53

您想为此使用内置的浏览器 HTML 条,而不是为自己应用正则表达式。它更安全,因为永远绿色的浏览器会为您完成工作。

angular.module('myApp.filters', []).
  filter('htmlToPlaintext', function() {
    return function(text) {
      return stripHtml(text);
    };
  }
);

var stripHtml = (function () {
  var tmpEl = $document[0].createElement("DIV");
  function strip(html) {
    if (!html) {
      return "";
    }
    tmpEl.innerHTML = html;
    return tmpEl.textContent || tmpEl.innerText || "";
  }
  return strip;
}());

将其包装在自执行函数中的原因是为了重用元素创建。

如何显示预览,而不是显示纯文本(它正在工作)。但我需要在发布问题或答案(包括图像)时显示堆栈溢出显示等预览
2021-03-17 07:45:53
将 $document[0] 更改为文档,它对我有用!谢谢
2021-03-26 07:45:53

<div ng-bind-html="myText"></div> 无需像 {{myText}} 那样放入 html {{}} 插值标签。

并且不要忘记在module中使用 ngSanitize,例如 var app = angular.module("myApp", ['ngSanitize']);

并在 index.html 页面中添加其 cdn 依赖项https://cdnjs.com/libraries/angular-sanitize