0

所以我需要从 CDATA 块中解析数据。

它看起来像

<![CDATA[Important text I need<span style=" color:#000000;"><img src="imageName.jpg" alt="imageName" border=0 style="vertical-align:text-bottom;" /></span>Still important text]]>

或者

<![CDATA[Important text I need]]>

或者

<![CDATA[imageName.jpg]]>

或类似的东西。

结果应该是一个数组,在第一个示例中,数组的内容将是“我需要的重要文本”、“imageName.jpg”、“仍然重要的文本”

另一个的结果将是一个数组,其中一个对象包含 imageName 或文本。

我现在被这个问题困扰了一段时间,因为我不太擅长正则表达式。这里有没有人遇到过同样的问题,你是怎么解决的?

还是我错过了一个简单的解决方法?

提前致谢!

4

2 回答 2

1

如果你使用NSXMLParser的是一个委托方法foundCDATA,它看起来像这样:

- (void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock{
    if (!parseElement) {
        return;
    }
    if (parsedElementData==nil) {
        parsedElementData = [[NSMutableData alloc] init];
    }
    [parsedElementData appendData:CDATABlock];

    //Grabs the whole content in CDATABlock.
    NSMutableString *content = [[NSMutableString alloc] initWithData:CDATABlock encoding:NSUTF8StringEncoding];

 }

现在将此预先编写的类添加到您的项目中。然后将其导入您要在其中使用它的解析器类:

#import NSString_stripHTML

现在您可以简单地将以下行添加到foundCDATA方法中:

NSString *strippedContent;
strippedContent = [content strippedHtml];

现在您将拥有没有任何额外字符的剥离文本。您可以从此剥离的文本中添加任何您想要的子串。

于 2013-11-11T13:54:07.410 回答
0

所以我找到了自己的解决方案:第一种方法在 cdataString 中搜索任何 HTML。如果 cdataString 包含任何 HTML,我会搜索“src=...”的出现。

- (NSString *)stringByStrippingHTML:(NSString *)htmlString {
    NSRange r;
    while ((r = [htmlString rangeOfString:@"<[^>]+>" options:NSRegularExpressionSearch]).location != NSNotFound){
        // substring from htmlString starting with "<" and ends with ">"
        NSString *substring     = [htmlString substringWithRange:r];

        //new Image String, stays empty if no image is found
        NSString *imageString   = @"";

        //length >= 9 because shortest possible result can be length nine, i.e. "src=1.png"
        if (substring.length >= 9) {

            //substring contains String "src=" ?
            NSRange imageRange      = [substring rangeOfString:@"src=[^>]+" options:NSRegularExpressionSearch];
            if (imageRange.location != NSNotFound) {

                //find the image name
                imageString  = [self imageFromHTMLString:substring];
            }
            //set the image string the imagename + my seperator tag
            imageString = [NSString stringWithFormat:@"##__##%@##__##",imageString];
        }
        //replace html stuff with either emty string or my imagename
        htmlString = [htmlString stringByReplacingCharactersInRange:r withString:imageString];

    }
    return htmlString;
}
- (NSString *)imageFromHTMLString:(NSString *)htmlString{
    NSRange range;

    NSString *result = @"";
    while ((range = [htmlString rangeOfString:@"src=[^>]+ " options:NSRegularExpressionSearch]).location != NSNotFound) {

        htmlString  = [[[htmlString substringWithRange:range] componentsSeparatedByString:@" "] objectAtIndex:0];
        result      = [htmlString stringByReplacingOccurrencesOfString:@"src=" withString:@""];
    }

    return result;

}

这些方法用于:

myCdataString = [self stringByStrippingHTML:myCdataString];

返回值是一个字符串,格式如下:

Important Text I need##__##ImageName.png##__##More ImportantText I need

创建一个数组可以通过 componentsSeparatedByString:@"##__##"

于 2013-02-15T11:42:20.900 回答