问题
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:
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);
来源:https://stackoverflow.com/questions/8780065/getting-image-size-from-html