需求来源

从后台返回的数据是一个数组,每个数组元素是html字符串,可以显示在一个UIWebView中。

在显示这个html字符串的详情页面的上一级是一个列表,展示标题和内容简介。但是,后台返回的数据中并没有简介字段。

万能的交互和技术一商量,接口不改,让iOS和Android客户端从“html字符串”中抽出具体的内容,当成简介。列表就显示3行,多余的用...来表示。霸道而虚弱的后台,就算吐槽也没用。

方案一:NSAttributedString

项目最低支持iOS7,所以NSAttributedString可以使用,其中有一个option叫做NSHTMLTextDocumentType,就是专门用来从“html字符串”抽取纯文本的。iOS UILabel显示HTML文本

这种API比较难用,所以这里要记一下,希望苹果以后能提供好用一点的API

NSString *htmlString = @"

Some html string \n This is some text! ";

NSAttributedString *attrStr = [[NSAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];

UILabel *myLabel = [[UILabel alloc] initWithFrame:self.view.bounds];

myLabel.attributedText = attrStr;

[self.view addSubview:myLabel];

从功能上来说,没有问题。不过,我们的应用场景是表格,而NSAttributedString是有比较严重的性能问题,表格会很卡,甚至还会崩溃。NSHTMLTextDocumentType is Slow

方案二:NSString+HTML

谷歌在很久之前就出过一个toolbox,里面有从“html字符串”抽取内容的函数。- (NSString *)gtm_stringByEscapingForHTML;就可以了。

实际用了一下,性能问题是解决了,不过有两个障碍需要解决:

这个库比较老,而且还是MRC的

大多数的html的标签是可以去掉的,但是还有残留,有些html标签去不掉,功能有问题,具体的原因,暂时还不清楚。

怎么解决

现在的工程是ARC的,引入MRC的源文件,会编译不过。所以要加编译选项,进行ARC和MRC的混编。对于需要MRC的源文件,添加-fno-objc-arc标记。Xcode中实现ARC和MRC混编

对于标签残留的问题,已经有人经过深入的研究,并且给出了解决方法- (NSString *)stringByConvertingHTMLToPlainText; 函数就可以了。

发现的坑

htmlUnescapes是一个全局的字典,通过键值对的方式将html的一些特殊标签替换为本地的表示方式。比如,将
替换为\n;但是这里却忘了将
替换为\n;

- (NSString *)stringByConvertingHTMLToPlainText;函数实现的扫描比对部分还是有问题的。比如输入是“abcd(abc), 1821”,结果变成了“abcd(abc), ”,数字“1821”被替换成了“”空字符。具体的原因和解决方法还没有找到。

这个第三方库的star数目有二百多,是在gitHub上输入HTML和Object-C关键字出现的star数目最多的一个。不过最后的更新还是在4年前,Goggle那个工具箱也是老掉牙了,还是MRC的。只是现在没有找到更好的,暂时还能用。

方案三:自己写

如果是将html中的<>标签全部去除,那么实现就相对简单,可以自己实现。<>标签没有嵌套,这是很重要的一个特性。将<>标签里的内容,包括<>本身都替换为空字符串“”就可以了。IOS去掉字符串中HTML标签的方法

- (NSString *)filterHTML:(NSString *)html {

NSScanner *scanner = [NSScanner scannerWithString:html];

NSString *text = nil;

while(![scanner isAtEnd]) {

//找到标签的起始位置

[scanner scanUpToString:@"

//找到标签的结束位置

[scanner scanUpToString:@">" intoString:&text];

//替换字符

html = [html stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@"%@>",text] withString:@""];

}

return html;

}

如果需求复杂一点,比如

要保留,不能简单的去掉,而是要替换为\n那么实现就复杂一点了。估计要在上面的代码中加入额外的判断了

如果要考虑全html那些特殊标签,那么估计代码就更复杂一点了。上面用的第三方库,基本的思路也是这个,考虑得比较全面,代码比较多。

html中如何显示纯文本,从Html中取出纯文本相关推荐

  1. 全部都显示服务器已加扰,特殊字符在浏览器中正确显示,但在phpMyAdmin中加扰...

    我有一个php netbeans项目.该项目的编码是UTF-8.特殊字符在ide中正确显示. (img 1)特殊字符在浏览器中正确显示,但在phpMyAdmin中加扰 我使用phpmyadmin,整个 ...

  2. html中怎么显示错误信息,在html中显示为内嵌错误的文本

    我正在尝试在某个图片旁边的div工具栏中放置标题.问题在于我的文本放置不当,应该至少位于工具栏的顶部,而是位于底部并且不移动. 我希望它在左边的垂直中间靠近图片.在html中显示为内嵌错误的文本 和画 ...

  3. matlab中axes显示,【原创】MATLAB中axes函数全功能解析

    axes ★★★★★ 功能 创建坐标系图形对象 语法 axes axes('PropertyName',propertyvalue,...) axes(h) h = axes(...) 描述 axes ...

  4. jsp中如何显示mysql数据库数据类型_jsp中如何以表格形式显示数据库中一个字段的数据?...

    试试下面这个,再有问题留下QQ,我直接给你搞 int b=list.size()%4; if(b>0){ a=a+1; int i=0; while(i ProcuctBean ptbean1= ...

  5. 如何实现标签元素在HTML页面中居中显示

    如何实现标签元素在HTML页面中居中显示 在HTML页面设计中常常需要实现标签元素在HTML页面中居中显示,相关知识点较多也较杂乱,本文试图介绍一些比较基本与实用的相关知识. 使用标签的align属性 ...

  6. ABBYY FineReader如果“文本”窗口中不显示非欧洲字符

    ABBYY FineReader是一款图文识别(OCR)软件,使用ABBYY FineReader可以识别阿拉伯语.希伯来语.意第绪语.泰国语.中文.日语和韩语文档.但是,如果文本窗口中有错误显示的C ...

  7. 格式化显示在Label控件中的金额格式文本 (2)

    通过Label控件的Text属性可以设置控件内显示的文本,而通过对象的ToString方法可以格式化字符串显示的格式.本实例设定在Label控件中金额的显示格式,运行结果如图1所示. <?XML ...

  8. 编写一程序,有2个文本框,在第一个文本框中输入一个整数,当焦点从第一个文本框离开时,第二个文本框将显示这个数的绝对值(使用FocusListener)。

    编写一程序,有2个文本框,在第一个文本框中输入一个整数,当焦点从第一个文本框离开时,第二个文本框将显示这个数的绝对值(使用FocusListener). import javax.swing.*; i ...

  9. easyui获取下拉框选中的文本值_Word中文本显示不全的常见3种情况及解决方法

    在日常工作使用Word文档时,经常会遇到文本显示不全的情况,比如文本框或表格里的文本显示不全等情况,你一般是怎么操作呢?以下这3种常见情况你可能也遇到过,一起看看是什么原因并解决它们吧! 1.文本显示 ...

  10. 在Winform的DataGridView的单元格中同时显示文本和图标,以及树形结构的示例

    树形结构的DataGridView:Customizing the DataGridView to support expanding/collapsing (ala TreeGridView)    ...

最新文章

  1. 一文看懂模糊搜索1.0到3.0的算法迭代历程
  2. 洛谷——P2626 斐波那契数列(升级版)矩阵
  3. 关于容器迁移、运维、查错与监控,你想知道的都在这里了
  4. 从老赖们“维权”,看拍拍贷的底色
  5. Pwn_9 作业讲解
  6. CVE-2014-4877 wget: FTP Symlink Arbitrary Filesystem Access
  7. NC14250 MMSet2
  8. Exception in thread main com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport e
  9. java中包容易出现的错误及权限问题
  10. 如何调整标题字体大小_软网推荐:找回调整Windows 10字号功能
  11. 一个软件系统的兼容性测试,在兼容性测试中,如何判断软件的兼容性?
  12. laravel view
  13. 集福啦!你想要的“福”这里都有~
  14. 7 125 kHz RFID技术
  15. 2020进博会品牌第一自行车辐轮王助力中国新时代健康建设大业
  16. AI面相手相V3.2.0无限多开版h5公众号版本源码(含搭建教程+运营文案图片)
  17. 1.1XAF框架开发视频教程-简单的订单管理实现过程,视频,提纲,及教程源码
  18. k8s之Horizontal Pod Autoscaler(Pod水平自动伸缩)
  19. 国际国内云计算发展现状及未来前景
  20. 股票量化交易Python——计算收益率

热门文章

  1. 如何 SSH 到 Linux 服务器里的特定目录及执行命令?
  2. 试用期间,云服务器操作系统可以更换吗?
  3. 代码级操作指南 | 如何在Docker Swarm中运行服务
  4. Metro风格的Android界面应用
  5. 数据驱动工程:跟踪使用,合理决策
  6. --6、专业信息表(表)
  7. mysql基础操作(二)
  8. 线上CPU100%?看看这篇是怎么排查的!
  9. JZOJ 3461. 【NOIP2013模拟联考5】小麦亩产一千八(kela)
  10. Elasticsearch教程(六) elasticsearch Client创建