angularjs输出纯文本而不是html


67

我有一些这样的文字:

<span>My text</span>

我想显示不带标签的内容:

My text

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

角HTML:

<div>{{myText | htmlToPlaintext}}</div>

您已经在AngularJS下对此进行了标记,所以我假设您想使用AngularJS显示文本。如果是这样,此文本是否在模型中?您使用哪个html标签显示模型的内容?
callmekatootie

@callmekatootie我根据Abhishek给出的答案创建了一个过滤器。
哈里

2
我看到了,他的解决方案使用了jQuery-您已在AngularJS下对此进行了标记,并且我认为您可以在AngularJS中完成此操作,而无需使用jQuery,前提是您可以在问题中提供更多信息-特别是您希望在哪里显示您所看到的文字...
callmekatootie

@callmekatootie,我添加了一个我正在做角度运动的示例
哈里

Answers:


210

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>  

7
我实际上更喜欢String(text).replace(/ <[^>] +> / gm,'')。我已经使用多年了,没有任何问题。
blockloop 2014年

13
jQuery的速度慢了40倍,但您仍然可以达到8000 ops / s,因此不使用jQuery就是过早的优化。
Blaise

4
我绝不会添加jQuery依赖项只是将html转换为文本,但是如果我的项目已经使用jQuery,我会选择jQuery解决方案,因为我认为自定义编写的正则表达式可读性较低,测试较少且可靠性较低。您的正则表达式可以防止所有形式的XSS吗?
Blaise

1
使用DOM引擎涵盖了更多情况,这种简单的替换方式可以代替那些非示例:此处的一些代码&#146; &#147; &#148;
Bogdan

4
您可能应该在其中添加一个null检查,否则它将输出“ null”:return text ? String(text).replace(/<[^>]+>/gm, '') : "";
Björn2015年

21

来自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>

2
我也会避免这种方法。可能不需要完整的jQuery所需的时间,但是肯定比接受的答案要慢得多。
2014年

3
我建议将您的文本包装在一个元素中,否则像“ hi”这样的普通旧字符串将返回一个空字符串angular.element('<div>'+text+'</div>').text();
Chris Jacob

如果您处于指令的链接函数中,则只需执行element.text()0.o
Jordan

2
我更喜欢这种解决方案而不是使用正则表达式,至少在速度不是很关键的情况下。这是更正确的方法,实际上会将html转换为纯文本,比符号,特殊实体和所有其他内容少得多。
GuyGizmo 2015年

如何显示预览,而不是显示纯文本(正在运行)。但是我还需要在发布问题或答案(包括图像)时像堆栈溢出显示一样显示预览
codelearner16年

4
var app = angular.module('myapp', []);

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

<p>{{DetailblogList.description | htmlToPlaintext}}</p>

1
在代码中添加一些格式和一些见解,有助于产生更好的答案。
Winner_joiner

2
请添加一些说明。您的答案目前被标记为“质量低下”,最终可能会被删除。
约翰尼斯·詹德

应当拒绝的低质量答案和应该删除的非答案之间是有区别的。请参阅您做错了:低质量帖子队列中的请求
twernt

如何显示预览,而不是显示纯文本(正在运行)。但是我还需要在发布问题或答案(包括图像)时像堆栈溢出显示一样显示预览
codelearner16年

3

您想为此使用内置的浏览器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;
}());

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


如何显示预览,而不是显示纯文本(正在运行)。但是我还需要在发布问题或答案(包括图像)的同时像堆栈溢出显示一样显示预览
codelearner16年

将$ document [0]更改为文档,它对我有用!谢谢你
艾伦·汉密尔顿


0

您可以使用ng-bind-html,不要忘记将$ sanitize服务注入模块中。



-7

像这样使用此功能

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

  "<span>My text</span>".text()
  output:
  My text

小提琴


8
这是一个基于jQuery的解决方案。问题是关于angularjs。
RevNoah 2014年

Rev标记答案是javascript,如果我使用jquery做到了,那会有所不同
pixelbyaj 2015年

1
您的解决方案与OP的要求不兼容。他已经在angularjs上构建了他的应用。jQuery是一个不同的框架。
Ibrahim Lawal 2015年

1
+1,我在这里看不到任何jQuery ... wtf?另一个问题是@Abjo的方法扩展了String原型中的构建。一些开发人员选择生气。
Marecky
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.