Получение размера изображения из HTML - PullRequest
0 голосов
/ 08 января 2012

Я анализирую RSS-ленту из блога и помещаю HTML-код поста в UIWebView.

Но теперь я бы хотел изменить размер изображений, чтобы они соответствовали экрану iPhone. Я пытаюсь со следующей заменой

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

Но, делая так, я заменяю только изображения шириной 480. И к тому же я не меняю высоту!

Знаете ли вы, есть ли способ заменить любую ширину на 300 и изменить высоту на тот же коэффициент?

1 Ответ

3 голосов
/ 09 января 2012

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