Вы можете сделать это с помощью регулярного выражения.Вы захотите сопоставить теги <img>
в строке и извлечь значения высоты и ширины, затем рассчитать новые желаемые значения высоты и ширины и затем заменить высоту и ширину в строке новыми значениями.
Следующий код должен работать, но он может пропустить некоторые крайние случаи (например, если атрибут высоты появляется перед атрибутом width в теге img
).
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);