2012-01-08 2 views
0

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

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

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

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

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

ответ

3

Вы можете сделать это, используя регулярное выражение. Вы хотите совместить теги <img> внутри строки и извлекать значения высоты и ширины, а затем вычислять новую требуемую высоту и ширину, а затем заменять высоту и ширину в строке новыми значениями.

Следующий код должен работать, но он может пропустить некоторые кромки (например, если атрибут height появляется перед атрибутом 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); 
Смежные вопросы