使用UIWebView 加载 HTML代码的疑惑

rollrock1987 2015-04-16 09:44:38
在对接一个论坛的数据(bbs),下发下来的数据是html代码的,比如里面有字体的大小、引用某人的发言、图片等等等等。
想到的办法跟遇到的问题
1.使用UITableViewCell + UIWebView,其中遇到2个问题 1> UITableViewCell的高度每个都不一样的,需要等到UIWebView加载完成之后才能更新。2> 有部分html代码里面比如有很多的图片,那UIWebView加载完成需要很长的时间,可能几分钟。

2.自己提取html代码里面需要的信息,现在能想到的是 文字(包括引用别人的发言)+图片,也遇到了问题1>怎么样确保提取的信息是正确的(有没有什么规则呢)。2>比如bbs里面的引用(盖楼)我应该用什么用的控件去实现呢?

问题已经困扰我好几天了,希望大家能够给我提点宝贵的意见,谢谢~~~~
...全文
124 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Bannings 2015-04-17
  • 打赏
  • 举报
回复
我用正则解析出来了,先给你看看效果:

目前只解析了 fieldset 标签,没有解析 legend ,不过从结果上来看层次已经出来了。
我的做法:
测试数据,一个3层的跟帖:

NSString *data = @"<fieldset><legend> 引用: 芳山 </legend><br /><fieldset><legend> 引用: zstc2005 </legend><br />2015.02.18的<br />\r\n<br />\r\n拌海蜇、拌皮蛋、拌菠菜、炒三冬、大蒜肉皮炒肚片、老燒魚塊,吃飯。<br />\r\n<br />\r\n</fieldset><br /><br />\r\n<br />\r\n大年30不杀鸡吗?</fieldset><br /><br />\r\n我們這的習俗是年菜一定要有一條魚或者魚的一部分,寓意<b>連年有餘</b>。";

Floor *floor = [Floor floorWithData:data];
NSLog(@"%@", floor);


用于封闭跟帖的实体对象,Floor:

@interface Floor : NSObject

@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *content;
@property (nonatomic, strong) Floor *replyFloor;
@property (nonatomic, copy) NSString *rawData;

+ (Floor *)floorWithData:(NSString *)rawData;

@end

@implementation Floor

+ (Floor *)floorWithData:(NSString *)rawData {
static NSString *fieldset = @"<fieldset>";
static NSString *fieldsetEnded = @"</fieldset>";

Floor *floor = [Floor new];
floor.rawData = rawData;

NSArray *fieldsetRanges = matchesInRegex(fieldset, floor.rawData);
NSArray *fieldsetEndedRanges = matchesInRegex(fieldsetEnded, floor.rawData);

if (fieldsetRanges.count != fieldsetEndedRanges.count) {
NSLog(@"格式不正确");
return nil;
}

NSString *content = floor.rawData;
if (fieldsetRanges.count + fieldsetEndedRanges.count > 0) {
NSRange replyStartRange = NSRangeFromString(fieldsetRanges.firstObject);
NSRange replyEndedRange = NSRangeFromString(fieldsetEndedRanges.lastObject);
NSString *replyString = [floor.rawData substringWithRange:NSMakeRange(replyStartRange.location,
replyEndedRange.location + replyEndedRange.length - replyStartRange.location)];

content = [floor.rawData stringByReplacingOccurrencesOfString:replyString withString:@""];

NSString *replyRawData = [replyString substringWithRange:NSMakeRange(fieldset.length, replyString.length - fieldset.length - fieldsetEnded.length)];
floor.replyFloor = [Floor floorWithData:replyRawData];
}
floor.content = content;

return floor;
}

@end

工具方法:

NSArray *matchesInRegex(NSString *pattern, NSString *rawData) {
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern
options:NSRegularExpressionCaseInsensitive
error:nil];
NSArray *matches = [regex matchesInString:rawData options:0 range:NSMakeRange(0, rawData.length)];
NSMutableArray *matchRanges = [NSMutableArray arrayWithCapacity:matches.count];
for (NSTextCheckingResult *match in matches) {
[matchRanges addObject:NSStringFromRange(match.range)];
}
return matchRanges;
}

核心在于标签的配对,逻辑并不算复杂,解析一层后,其他的靠递归就行了,剩下的功能你先自己实现下,我只能抛砖引玉,如果你遇到什么问题再来讨论。
需要你实现的功能:
1. 解析 legend
2. 可能需要将剩下的 html 标签去除
rollrock1987 2015-04-17
  • 打赏
  • 举报
回复
你好,经过昨天的研究,可以用正则表达式提取我想要的内容 现在还剩下一个问题,就是 “引用,盖楼“ 我应该用什么控件来做,或者说有什么思路自己来画的么?
rollrock1987 2015-04-16
  • 打赏
  • 举报
回复
"body": "從此再無週六工作表,心裏想想還是有點悲傷。<br />\r\n    可不能不走出來,生活還是要繼續的。<br />\r\n    賣的一瓶番茄醬快到期了,那就拿出來自己吃。<br />\r\n    今天早上我倒了點蘸白饅頭,中午老媽炒個雞蛋。<br />\r\n    老爸買的牛肉是鹽水牛肉和醬牛肉都有,隨便往粉絲湯裏面加哪種。<br />\r\n    炒菜薹、炒茼蒿、番茄炒蛋、牛肉粉絲湯,吃飯。<br />\r\n<br />\r\n<img id=\"attach152767\" alt=\"CIMG0001.JPG\" src=\"attachments/201503/20150314111250ba01a90c72da292015cd81f2949baf43.jpg.thumb.jpg\" onclick=\"Previewurl('attachments/201503/20150314111250ba01a90c72da292015cd81f2949baf43.jpg')\" onmouseover=\"domTT_activate(this, event, 'content', '<strong>大小</strong>: 1.44 MB<br /><span title="2015-03-14 11:12:51">1月2天前</span>', 'styleClass', 'attach', 'x', findPosition(this)[0], 'y', findPosition(this)[1]-58);\" /><br />\r\n<br />\r\n<img id=\"attach152768\" alt=\"CIMG0002.JPG\" src=\"attachments/201503/201503141113402719292e89009c4ad366d6d0ba6071ea.jpg.thumb.jpg\" onclick=\"Previewurl('attachments/201503/201503141113402719292e89009c4ad366d6d0ba6071ea.jpg')\" onmouseover=\"domTT_activate(this, event, 'content', '<strong>大小</strong>: 1.18 MB<br /><span title="2015-03-14 11:13:41">1月2天前</span>', 'styleClass', 'attach', 'x', findPosition(this)[0], 'y', findPosition(this)[1]-58);\" /><br />\r\n<br />\r\n<img id=\"attach152769\" alt=\"CIMG0003.JPG\" src=\"attachments/201503/2015031411172720e89bda2c12dde554048772da345bf3.jpg.thumb.jpg\" onclick=\"Previewurl('attachments/201503/2015031411172720e89bda2c12dde554048772da345bf3.jpg')\" onmouseover=\"domTT_activate(this, event, 'content', '<strong>大小</strong>: 1.25 MB<br /><span title="2015-03-14 11:17:28">1月2天前</span>', 'styleClass', 'attach', 'x', findPosition(this)[0], 'y', findPosition(this)[1]-58);\" /><br />\r\n<br />\r\n<img id=\"attach152770\" alt=\"CIMG0004.JPG\" src=\"attachments/201503/20150314111900e7e785a8b58bbc92aec955ccb6a61761.jpg.thumb.jpg\" onclick=\"Previewurl('attachments/201503/20150314111900e7e785a8b58bbc92aec955ccb6a61761.jpg')\" onmouseover=\"domTT_activate(this, event, 'content', '<strong>大小</strong>: 1.04 MB<br /><span title="2015-03-14 11:19:01">1月2天前</span>', 'styleClass', 'attach', 'x', findPosition(this)[0], 'y', findPosition(this)[1]-58);\" /><br />\r\n<br />\r\n<img id=\"attach152771\" alt=\"CIMG0005.JPG\" src=\"attachments/201503/20150314111955981b997580efb9634dab597e7116ca44.jpg.thumb.jpg\" onclick=\"Previewurl('attachments/201503/20150314111955981b997580efb9634dab597e7116ca44.jpg')\" onmouseover=\"domTT_activate(this, event, 'content', '<strong>大小</strong>: 1.32 MB<br /><span title="2015-03-14 11:19:56">1月2天前</span>', 'styleClass', 'attach', 'x', findPosition(this)[0], 'y', findPosition(this)[1]-58);\" />"
rollrock1987 2015-04-16
  • 打赏
  • 举报
回复
"body": "<fieldset><legend> 引用: 芳山 </legend><br /><fieldset><legend> 引用: zstc2005 </legend><br />2015.02.18的<br />\r\n<br />\r\n拌海蜇、拌皮蛋、拌菠菜、炒三冬、大蒜肉皮炒肚片、老燒魚塊,吃飯。<br />\r\n<br />\r\n</fieldset><br /><br />\r\n<br />\r\n大年30不杀鸡吗?</fieldset><br /><br />\r\n我們這的習俗是年菜一定要有一條魚或者魚的一部分,寓意<b>連年有餘</b>。"
Bannings 2015-04-16
  • 打赏
  • 举报
回复
用第2种方式,你抓一个完整的 html 给我,我先看看,这种东西都是需要定制的
mengxianzhivip 2015-04-16
  • 打赏
  • 举报
回复
- (void)webViewDidFinishLoad:(UIWebView *)webView{ [reload tableView]; //这个时候重新刷新tableView 此时又会重新加载webview 你要判断下就不能在[reload tableView]了 至于怎么判断 就是你的程序而定了; } 第二个问题没懂

29,028

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧