Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone NSScanner循环问题_Iphone_Objective C_Nsscanner - Fatal编程技术网

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解析器。