【问题标题】:Range of NSString, change html tagNSString 的范围,更改 html 标签
【发布时间】:2014-01-29 14:02:10
【问题描述】:

我正在寻找找到一系列 html 图像标签并对其进行更改的方法。网上没有找到好的解决办法,希望大家帮帮我。

示例字符串:

NSString *htmlString = @"<p><a href="/url/10/512.png"><img src="/url/10/512.png" alt=" " border="0" /></a></p><div style="clear:both;"></div>";

如何查找和更改img src="/url/10/512.png"

img 源是动态的并且总是不同的,所以我正在寻找最佳解决方案。

我能想到的最好方法是使用 rangeOfString 找到 img src=",然后从该范围内循环遍历字符串并找到一个 qoute 标记“然后我会知道整个范围,并且可以更改它。

但这看起来很糟糕,我认为有更好的解决方案。也许有人知道如何或知道一些我可以找到有用的链接?

编辑: 抱歉我没有提到,我的字符串可以更长并且包含多个 img 标签 例如

NSString *htmlString = @"<p><a href="/url/10/512.png"><img src="/url/10/512.png" alt=" " border="0" /></a><a href="/url/10/513.png"><img src="/url/10/513.png" alt=" " border="0" /></a></p><div style="clear:both;"></div>";

提前致谢!

【问题讨论】:

  • 正则表达式是解决此问题的最佳方法,类似于 (@"img src=\".*\""),不是这样,但您可以使用这种方法解决你的问题
  • @A'saDickens,感谢您的评论,我也考虑过正则表达式,只是在正则表达式方面我是一个真正的菜鸟:(

标签: ios iphone objective-c nsstring nsrange


【解决方案1】:

如果您将循环结束双引号的部分替换为对 rangeOfString:options:range: 的调用,将范围从 img src=" 子字符串的末尾加上一到字符串的末尾,您的解决方案将不再“看起来很讨厌”。当然,您总是可以使用正则表达式来查找img src=\"([^\"]*)\",但这可能需要几行额外的代码:

NSString *str = @"<p><a href=\"/url/10/512.png\"><img src=\"/url/10/512.png\" alt=\" \" border=\"0\" /></a></p><div style=\"clear:both;\"></div>";
NSError *err;
NSRegularExpression *regex = [NSRegularExpression
    regularExpressionWithPattern:@"img src=\"([^\"]*)\""
    options:NSRegularExpressionCaseInsensitive
    error:&err];
NSTextCheckingResult *m = [regex firstMatchInString:str options:0 range:NSMakeRange(0, str.length)];
if (!NSEqualRanges(m.range, NSMakeRange(NSNotFound, 0))) {
    NSLog(@"%@", [str substringWithRange:[m rangeAtIndex:1]]);
}

这会产生

的输出
/url/10/512.png

我的字符串可以更长,包含多个img标签

使用上面的正则表达式,您可以通过调用matchesInString: 并循环遍历结果来获取它们。

【讨论】:

  • 感谢您的评论,这正是我要找的!
【解决方案2】:

您可以为 NSString 创建一个类别。特别是,如果此操作将用于不同的类。

@interface NSString (Utils)
- (NSString *)replaceStringPattern:(NSString *)searchPattern withString:(NSString *)replacementString;
@end

@implementation NSString (Utils)

- (NSString *)replaceStringPattern:(NSString *)searchPattern withString:(NSString *)replacementString
{
    NSRange range = NSMakeRange(0, self.length);

    NSError *error = nil;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:searchPattern options:NSRegularExpressionCaseInsensitive error:&error];
    if (error)
    {
        NSLog(@"ERROR: Regular expression cannot be created for pattern %@", searchPattern);
    }
    return [regex stringByReplacingMatchesInString:self options:0 range:range withTemplate:replacementString];
}

@end

rangeOfString: 方法和 NSRegularExpression 类都可以使用(我更喜欢最后一个)。然后,您可以从项目中的任何位置调用它,如下所示:

    NSString *htmlString = @"<p><a href=\"/url/10/512.png\"><img src=\"/url/10/512.png\" alt=\" \" border=\"0\" /></a></p><div style=\"clear:both;\"></div>";
    NSString *newImgSrc = @"/url/10/512_new.png";
    NSString *newHtmlString = [htmlString replaceStringPattern:@"img src=\"([^\"]*)\"" 
            withString:[NSString stringWithFormat:@"img src=\"%@\"", newImgSrc]];

【讨论】:

    【解决方案3】:

    试试这个...

    htmlString = [htmlString substringFromIndex:[htmlString rangeOfString:@"img src="].location];
    NSRange range = [htmlString rangeOfString:@".png\""];
    htmlString = [htmlString substringToIndex:(range.location + range.length)];
    NSLog(@"%@",htmlString);
    

    【讨论】:

      【解决方案4】:

      你可以使用这个 NSString 方法

      - (NSRange)rangeOfString:(NSString *)aString
      

      你可以找到你想要的字符串的 NSRange 并从这个范围内获取数据。

      HPH。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-17
        • 2014-02-19
        • 1970-01-01
        • 2016-11-12
        • 2023-01-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多