Getting image size from HTML

2019-06-09 05:50发布

I'm parsing an RSS feed from a blog, and putting the HTML of a post inside a UIWebView.

But now I would like to change the size of the images to fit the iPhone screen. I'm trying with the following replace

HTMLContent = [HTMLContent stringByReplacingOccurrencesOfString:@"width=\"480\"" withString:@"width=\"300\""];

But doing like this I'm replacing only the images with 480 width. And moreover I'm not changing the height!

Do you know if there is a way to replace any width with 300, and changing the height by the same factor?

1条回答
Emotional °昔
2楼-- · 2019-06-09 06:03

You can do this using a Regular Expression. You'll want to match the <img> tags within the string and extract the height and width values, then calculate your new desired height and width, and then replace the height and width in the string with the new values.

The following code should work, but it may miss some edge cases (such as if the height attribute appears before the width attribute in the img tag).

int maxWidth = 300;
NSString *originalHTML = @"<html><body><img src='image1.gif' width='4800' height='80' alt='foobar'/><img src='image1.gif' width='70000' height='99999' alt='foobar'/></body></html>";

NSString *regexPattern = @"<img[^>]*width=['\"\\s]*([0-9]+)[^>]*height=['\"\\s]*([0-9]+)[^>]*>";

NSRegularExpression *regex = 
[NSRegularExpression regularExpressionWithPattern:regexPattern 
                                          options:NSRegularExpressionDotMatchesLineSeparators 
                                            error:nil];

NSMutableString *modifiedHTML = [NSMutableString stringWithString:originalHTML];

NSArray *matchesArray = [regex matchesInString:modifiedHTML 
                                   options:NSRegularExpressionCaseInsensitive 
                                     range:NSMakeRange(0, [modifiedHTML length]) ]; 

NSTextCheckingResult *match;

// need to calculate offset because range position of matches
// within the HTML string will change after we modify the string
int offset = 0, newoffset = 0;

for (match in matchesArray) {

    NSRange widthRange = [match rangeAtIndex:1];
    NSRange heightRange = [match rangeAtIndex:2];

    widthRange.location += offset;
    heightRange.location += offset;

    NSString *widthStr = [modifiedHTML substringWithRange:widthRange];
    NSString *heightStr = [modifiedHTML substringWithRange:heightRange];

    int width = [widthStr intValue];
    int height = [heightStr intValue];

    if (width > maxWidth) {
        height = (height * maxWidth) / width;
        width = maxWidth;

        NSString *newWidthStr = [NSString stringWithFormat:@"%d", width];
        NSString *newHeightStr = [NSString stringWithFormat:@"%d", height];

        [modifiedHTML replaceCharactersInRange:widthRange withString:newWidthStr];

        newoffset = ([newWidthStr length] - [widthStr length]);
        heightRange.location += newoffset;

        [modifiedHTML replaceCharactersInRange:heightRange withString:newHeightStr];                

        newoffset += ([newHeightStr length] - [heightStr length]);            
        offset += newoffset;
    }
}

NSLog(@"%@",modifiedHTML);
查看更多
登录 后发表回答