html中如何显示纯文本,从Html中取出纯文本
需求来源
从后台返回的数据是一个数组,每个数组元素是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中取出纯文本相关推荐
- 全部都显示服务器已加扰,特殊字符在浏览器中正确显示,但在phpMyAdmin中加扰...
我有一个php netbeans项目.该项目的编码是UTF-8.特殊字符在ide中正确显示. (img 1)特殊字符在浏览器中正确显示,但在phpMyAdmin中加扰 我使用phpmyadmin,整个 ...
- html中怎么显示错误信息,在html中显示为内嵌错误的文本
我正在尝试在某个图片旁边的div工具栏中放置标题.问题在于我的文本放置不当,应该至少位于工具栏的顶部,而是位于底部并且不移动. 我希望它在左边的垂直中间靠近图片.在html中显示为内嵌错误的文本 和画 ...
- matlab中axes显示,【原创】MATLAB中axes函数全功能解析
axes ★★★★★ 功能 创建坐标系图形对象 语法 axes axes('PropertyName',propertyvalue,...) axes(h) h = axes(...) 描述 axes ...
- jsp中如何显示mysql数据库数据类型_jsp中如何以表格形式显示数据库中一个字段的数据?...
试试下面这个,再有问题留下QQ,我直接给你搞 int b=list.size()%4; if(b>0){ a=a+1; int i=0; while(i ProcuctBean ptbean1= ...
- 如何实现标签元素在HTML页面中居中显示
如何实现标签元素在HTML页面中居中显示 在HTML页面设计中常常需要实现标签元素在HTML页面中居中显示,相关知识点较多也较杂乱,本文试图介绍一些比较基本与实用的相关知识. 使用标签的align属性 ...
- ABBYY FineReader如果“文本”窗口中不显示非欧洲字符
ABBYY FineReader是一款图文识别(OCR)软件,使用ABBYY FineReader可以识别阿拉伯语.希伯来语.意第绪语.泰国语.中文.日语和韩语文档.但是,如果文本窗口中有错误显示的C ...
- 格式化显示在Label控件中的金额格式文本 (2)
通过Label控件的Text属性可以设置控件内显示的文本,而通过对象的ToString方法可以格式化字符串显示的格式.本实例设定在Label控件中金额的显示格式,运行结果如图1所示. <?XML ...
- 编写一程序,有2个文本框,在第一个文本框中输入一个整数,当焦点从第一个文本框离开时,第二个文本框将显示这个数的绝对值(使用FocusListener)。
编写一程序,有2个文本框,在第一个文本框中输入一个整数,当焦点从第一个文本框离开时,第二个文本框将显示这个数的绝对值(使用FocusListener). import javax.swing.*; i ...
- easyui获取下拉框选中的文本值_Word中文本显示不全的常见3种情况及解决方法
在日常工作使用Word文档时,经常会遇到文本显示不全的情况,比如文本框或表格里的文本显示不全等情况,你一般是怎么操作呢?以下这3种常见情况你可能也遇到过,一起看看是什么原因并解决它们吧! 1.文本显示 ...
- 在Winform的DataGridView的单元格中同时显示文本和图标,以及树形结构的示例
树形结构的DataGridView:Customizing the DataGridView to support expanding/collapsing (ala TreeGridView) ...
最新文章
- 一文看懂模糊搜索1.0到3.0的算法迭代历程
- 洛谷——P2626 斐波那契数列(升级版)矩阵
- 关于容器迁移、运维、查错与监控,你想知道的都在这里了
- 从老赖们“维权”,看拍拍贷的底色
- Pwn_9 作业讲解
- CVE-2014-4877 wget: FTP Symlink Arbitrary Filesystem Access
- NC14250 MMSet2
- Exception in thread main com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport e
- java中包容易出现的错误及权限问题
- 如何调整标题字体大小_软网推荐:找回调整Windows 10字号功能
- 一个软件系统的兼容性测试,在兼容性测试中,如何判断软件的兼容性?
- laravel view
- 集福啦!你想要的“福”这里都有~
- 7 125 kHz RFID技术
- 2020进博会品牌第一自行车辐轮王助力中国新时代健康建设大业
- AI面相手相V3.2.0无限多开版h5公众号版本源码(含搭建教程+运营文案图片)
- 1.1XAF框架开发视频教程-简单的订单管理实现过程,视频,提纲,及教程源码
- k8s之Horizontal Pod Autoscaler(Pod水平自动伸缩)
- 国际国内云计算发展现状及未来前景
- 股票量化交易Python——计算收益率