使用UIWebView 加载 HTML代码的疑惑

iOS 码拜 10年前 (2015-05-08) 939次浏览 0个评论
 

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

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

问题已经困扰我好几天了,希望大家能够给我提点宝贵的意见,谢谢~~~~

用第2种方式,你抓一个完整的 html 给我,我先看看,这种东西都是需要定制的
 “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>。”
 “body”: “從此再無週六工作表,心裏想想還是有點悲傷。<br />\r\n &nbsp; &nbsp;可不能不走出來,生活還是要繼續的。<br />\r\n &nbsp; &nbsp;賣的一瓶番茄醬快到期了,那就拿出來自己吃。<br />\r\n &nbsp; &nbsp;今天早上我倒了點蘸白饅頭,中午老媽炒個雞蛋。<br />\r\n &nbsp; &nbsp;老爸買的牛肉是鹽水牛肉和醬牛肉都有,隨便往粉絲湯裏面加哪種。<br />\r\n &nbsp; &nbsp;炒菜薹、炒茼蒿、番茄炒蛋、牛肉粉絲湯,吃飯。<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””, “”&lt;strong&gt;大小&lt;/strong&gt;: 1.44 MB&lt;br /&gt;&lt;span title=&quot;2015-03-14 11:12:51&quot;&gt;1月2天前&lt;/span&gt;””, “”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””, “”&lt;strong&gt;大小&lt;/strong&gt;: 1.18 MB&lt;br /&gt;&lt;span title=&quot;2015-03-14 11:13:41&quot;&gt;1月2天前&lt;/span&gt;””, “”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””, “”&lt;strong&gt;大小&lt;/strong&gt;: 1.25 MB&lt;br /&gt;&lt;span title=&quot;2015-03-14 11:17:28&quot;&gt;1月2天前&lt;/span&gt;””, “”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””, “”&lt;strong&gt;大小&lt;/strong&gt;: 1.04 MB&lt;br /&gt;&lt;span title=&quot;2015-03-14 11:19:01&quot;&gt;1月2天前&lt;/span&gt;””, “”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””, “”&lt;strong&gt;大小&lt;/strong&gt;: 1.32 MB&lt;br /&gt;&lt;span title=&quot;2015-03-14 11:19:56&quot;&gt;1月2天前&lt;/span&gt;””, “”styleClass””, “”attach””, “”x””, findPosition(this)[0], “”y””, findPosition(this)[1]-58);” />”
– (void)webViewDidFinishLoad:(UIWebView *)webView{
    [reload tableView];
    //这个时候重新刷新tableView 此时又会重新加载webview 你要判断下就不能在[reload tableView]了 至于怎么判断 就是你的程序而定了;
}

第二个问题没懂 

150分
我用正则解析出来了,先给你看看效果:
使用UIWebView 加载 HTML代码的疑惑
目前只解析了 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 标签去除

你好,经过昨天的研究,可以用正则表达式提取我想要的内容
现在还剩下一个问题,就是  “引用,盖楼“   我应该用什么控件来做,或者说有什么思路自己来画的么?

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明使用UIWebView 加载 HTML代码的疑惑
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!