Iphone NSScanner循环问题
我有一个Iphone NSScanner循环问题,iphone,objective-c,nsscanner,Iphone,Objective C,Nsscanner,我有一个NSScanner对象,可以扫描HTML文档中的段落标记。扫描器似乎在找到第一个结果时停止,但我需要数组中的所有结果 如何改进我的代码以遍历整个文档 - (NSArray *)getParagraphs:(NSString *) html { NSScanner *theScanner; NSString *text = nil; theScanner = [NSScanner scannerWithString: html]; NSMutableA
NSScanner
对象,可以扫描HTML文档中的段落标记。扫描器似乎在找到第一个结果时停止,但我需要数组中的所有结果
如何改进我的代码以遍历整个文档
- (NSArray *)getParagraphs:(NSString *) html
{
NSScanner *theScanner;
NSString *text = nil;
theScanner = [NSScanner scannerWithString: html];
NSMutableArray*paragraphs = [[NSMutableArray alloc] init];
// find start of tag
[theScanner scanUpToString: @"<p>" intoString: NULL];
if ([theScanner isAtEnd] == NO) {
NSInteger newLoc = [theScanner scanLocation] + 10;
[theScanner setScanLocation: newLoc];
// find end of tag
[theScanner scanUpToString: @"</p>" intoString: &text];
[paragraphs addObject:text];
}
return text;
}
-(NSArray*)获取段落:(NSString*)html
{
NSScanner*扫描仪;
NSString*text=nil;
扫描仪=[NSScanner SCANNER WITHSTRING:html];
NSMutableArray*段落=[[NSMutableArray alloc]init];
//查找标记的开始
[扫描程序扫描字符串:@“”到字符串:NULL];
如果([扫描程序IsAttend]==否){
NSInteger newLoc=[扫描位置]+10;
[扫描仪设置扫描位置:newLoc];
//查找标记的结尾
[扫描程序扫描字符串:@“”到字符串:&text];
[目的:案文];
}
返回文本;
}
免责声明:要解析HTML,最好使用HTML解析器,如libxml的HTML4解析器,尤其是处理任意可能格式错误的HTML。无论如何,由于问题是如何使用NSParser
改进现有代码,因此我提供以下示例。这在大多数情况下都会起作用,但也有一些极端情况下不会起作用。对于seriuos HTML解析,请使用HTML解析器
迭代,直到扫描仪耗尽所有字符:
NSScanner* scanner = [NSScanner scannerWithString:html];
NSMutableArray *paragraphs = [[NSMutableArray alloc] init];
[scanner scanUpToString:@"<p" intoString:nil];
while (![scanner isAtEnd]) {
[scanner scanUpToString:@">" intoString:nil];
[scanner scanString:@">" intoString:nil];
NSString * text = nil;
[scanner scanUpToString:@"</p>" intoString:&text];
if (text) { // if html contains empty paragraphs <p></p>, text could be nil
[paragraphs addObject:text];
}
[scanner scanUpToString:@"<p" intoString:nil];
}
...
[paragraphs release];
NSScanner*scanner=[NSScanner scannerWithString:html];
NSMutableArray*段落=[[NSMutableArray alloc]init];
[扫描程序扫描字符串:@“intoString:nil];
[扫描仪扫描字符串:@“>”到字符串:无];
NSString*text=nil;
[扫描仪扫描字符串:@“”intoString:&text];
如果(text){//如果html包含空段落,则文本可能为零
[目的:案文];
}
[scanner ScanupString:@”不要使用扫描仪来解析HTML(也不要使用正则表达式……哦,痛苦)*。HTML的全部意义在于它是一个结构化文档,被设计成节点树或对象树。几乎整个基于DOM[文档对象模型]的行业都是围绕这一点构建的
只需使用XML解析器,因为[结构良好的HTML实际上就是XML](或者——如果您需要事件驱动的话——)将非常有效
或者,如果您必须处理格式错误的HTML(即任意服务器),请使用适当的HTML解析器
这是一个很好的例子
*更不用说解析HTML在业界是一个“已解决的问题”。没有必要推出新的问题。这在任何数量的完全有效的情况下都会失败;.
或这是一个段落中的段落。例如,我编辑代码以考虑@bbum建议的元素属性。关于嵌套段落,我认为它们不是有效的html。是的--你是对的。fdc
无效…但是,在解析任意html时,“有效”通常意味着“无论当前浏览器做什么”,结构有效性并不是一个真正的考虑因素。此外--IIRC,a我编辑了这个问题,以反映使用HTML解析器会更好,这就是为什么要使用libxml2的HTML4解析器……只要有人说“HTML不是XML”,他们通常指的是缺乏适当的强制标记结构,而libxml2应该注意这一点。HTML和XHTML之间的区别不仅仅是强制的结束标记(或自动关闭标记)。因此,“结构良好的HTML实际上只是XML”听起来不太准确。HTML可以很好地结构化,但仍然不是XML。无论如何,我同意最好使用HTML解析器。