简体   繁体   中英

iOS: resize images in html attributed string

I have a attributed string which is decoded from html code

NSAttributedString *htmlstring =[[NSAttributedString alloc] initWithData:[formatString dataUsingEncoding:NSUnicodeStringEncoding] options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
                                                                                                                                              NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)}documentAttributes:nil error:&error];

And in the string I have multiple img tags like

...
<p style="text-align: left;">
<img src="http://139.196.32.98/ueditor/php/upload/image/20160408/1460107835846711.jpg" alt="1460107835846711.jpg" width="75" height="103" style="width: 75px; height: 103px;"/>
<img src="http://139.196.32.98/ueditor/php/upload/image/20160408/1460106959338375.jpg" alt="1460106959338375.jpg" width="359" height="445" style="width: 359px; height: 445px;"/></p>
...

Now I have to resize the image in order to fix the mobile screen. And I tried

 NSString* substring = @"<img";
 NSRange range = [htmlstring rangeOfString:substring];

but it only returns the first search result, and how to make the whole tag into a substring?

Thank you so much

In order to continue searching past first occurrence, you need to adjust the range you perform your search in. There's a method on NSString that allows you do just that:

- [NSString rangeOfString:options:range:];

So you need to go beneath NSAttributedString and work with its plain-text representation which can be accessed via its read-only string property.

So the idea is to calculate a new search range every time a match is found:

NSString *substring = @"<img";
NSString *plainString = [htmlstring string];
NSRange searchRange = NSMakeRange(0, [plainString length]);
NSRange openingTagRange = [plainString rangeOfString:substring options:0 range:searchRange];
while  ( openingTagRange.location < [plainString length] )
{
    NSLog(@"found opening tag at %lu", (unsigned long)openingTagRange.location);
    searchRange.location = NSMaxRange(openingTagRange);
    searchRange.length = [plainString length] - NSMaxRange(openingTagRange);
    openingTagRange = [plainString rangeOfString:openingTagString options:0 range:searchRange];
}

If you also want to make the whole tag into a substring, the while loop expands into the following:

while  ( openingTagRange.location < [plainString length] )
{
    searchRange.location = NSMaxRange(openingTagRange);
    searchRange.length = [plainString length] - NSMaxRange(openingTagRange);
    NSRange closingTagRange = [plainString rangeOfString:@">" options:0 range:searchRange];

    if (closingTagRange.location > [plainString length])
    {
        break;
    }

    NSRange wholeTagRange = NSMakeRange(openingTagRange.location, NSMaxRange(closingTagRange) - openingTagRange.location);
    NSString *wholeTagString = [plainString substringWithRange:wholeTagRange];
    NSLog(@"wholeTagString == %@", wholeTagString);
    searchRange.location = NSMaxRange(wholeTagRange);
    searchRange.length = [plainString length] - NSMaxRange(wholeTagRange);
    openingTagRange = [plainString rangeOfString:substring options:0 range:searchRange];
}

Note, that the first closing bracket encountered is assumed to close the tag, which, I guess, might not always be the case.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM