【问题标题】:Retrieve contents from HTML which is a NSString从作为 NSString 的 HTML 中检索内容
【发布时间】:2018-09-04 15:55:20
【问题描述】:

这是我的 NSString :

 NSString timeString = @"<h5 style="direction:ltr"><span data-version-created-date="20180326T120530.000+0000" class="releasedDate">26-Mar-2018 12:05:30</span></h5>";

我只想检索 span 标签中的“26-Mar-2018 12:05:30”。 我如何在 Objective C 中做到这一点?

请注意:给定的 HTML 是 NSString 格式。

【问题讨论】:

  • 您可以将您的 HTMLString 转换为 NSAttributedString,然后阅读 myAttributedString.string 应该会给您“26-Mar-2018 12:05:30”。否则,您可以使用NSScannerrangeOf: 并解析它。

标签: html ios objective-c nsstring


【解决方案1】:

试试这个

- (NSString *)stringByStrippingHTML : (NSString*) s {
    NSRange r;
    while ((r = [s rangeOfString:@"<[^>]+>" options:NSRegularExpressionSearch]).location != NSNotFound)
    s = [s stringByReplacingCharactersInRange:r withString:@""];
    return s;
}

【讨论】:

  • NSString *timeString = @"
    26-Mar-2018 12:05: 30
    "; NSLog([self stringByStrippingHTML:timeString]);
【解决方案2】:

这将通过去除括号 () 表达式来工作。斜线已添加 () 到 timeString 以使其正确 NSString*。剥离重复四次,bt 应该是带条件循环的。

NSString * timeString = @"<h5 style=\"direction:ltr\"><span data-version-created-date=\"20180326T120530.000+0000\" class=\"releasedDate\">26-Mar-2018 12:05:30</span></h5>";

NSRange openRange = [timeString rangeOfString:@"<"];
NSRange closeRange = [timeString rangeOfString:@">"];
NSRange enclosedRange = NSMakeRange(openRange.location, closeRange.location-openRange.location+1);
timeString = [timeString stringByReplacingCharactersInRange:enclosedRange withString:@""];

openRange = [timeString rangeOfString:@"<"];
closeRange = [timeString rangeOfString:@">"];
enclosedRange = NSMakeRange(openRange.location, closeRange.location-openRange.location+1);
timeString = [timeString stringByReplacingCharactersInRange:enclosedRange withString:@""];

openRange = [timeString rangeOfString:@"<"];
closeRange = [timeString rangeOfString:@">"];
enclosedRange = NSMakeRange(openRange.location, closeRange.location-openRange.location+1);
timeString = [timeString stringByReplacingCharactersInRange:enclosedRange withString:@""];

openRange = [timeString rangeOfString:@"<"];
closeRange = [timeString rangeOfString:@">"];
enclosedRange = NSMakeRange(openRange.location, closeRange.location-openRange.location+1);
timeString = [timeString stringByReplacingCharactersInRange:enclosedRange withString:@""];

NSLog(@"timeString = %@", timeString);

【讨论】:

    【解决方案3】:

    这对我有用

     NSString *timeString = @"<h5 style=\"direction:ltr\"><span data-version-created-date=\"20180326T120530.000+0000\" class=\"releasedDate\">26-Mar-2018 12:05:30</span></h5>";
      NSRegularExpression *regex = [NSRegularExpression
                                  regularExpressionWithPattern:@">\\d.+\\d<"
                                  options:NSRegularExpressionCaseInsensitive
                                  error:NULL];
    [regex enumerateMatchesInString:timeString options:0 range:NSMakeRange(0, [timeString length]) usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop){
        // your code to handle matches here
    
        NSString *subString = [timeString substringWithRange:match.range];
    
        NSLog(@"%@",[subString substringWithRange:NSMakeRange(1, subString.length - 2)]);
    
    }];
    

    【讨论】:

      【解决方案4】:

      如果你想确保你得到跨标签之间的日期,最好比剥离所有 HTML 标签并假设唯一剩下的就是日期,或者假设只有一个更明确整个 HTML 文本中的 span 标签。它现在可能有效,但如果 HTML 发生变化,将来可能会中断。

      NSString * timeString = @"<h5 style=\"direction:ltr\"><span data-version-created-date=\"20180326T120530.000+0000\" class=\"releasedDate\">26-Mar-2018 12:05:30</span><span class=\"someOtherClass\">garbageData</span></h5>";
      NSRegularExpression *regex = [NSRegularExpression
                                    regularExpressionWithPattern:@"<span.*class=\"releasedDate\"[^>]*>(.*)</span.*>"
                                    options:NSRegularExpressionCaseInsensitive
                                    error:nil];
      NSTextCheckingResult *textCheckingResult = [regex firstMatchInString:timeString options:0 range:NSMakeRange(0, timeString.length)];
      
      NSString *releaseDateString = [timeString substringWithRange:[textCheckingResult rangeAtIndex:1]];
      if( ! [releaseDateString isEqualToString:@""] )
      {
          NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
          [dateFormatter setDateFormat:@"dd-MMM-yyyy' 'HH:mm:ss"];
           NSDate *releaseDate = [dateFormatter dateFromString:releaseDateString];
      
          NSLog( @"%@ - %@", releaseDateString, releaseDate );
      }
      

      请注意,即使 HTML 文本中有其他跨度,这也有效。它专门提取了具有“releasedDate”类的那个。

      【讨论】:

        猜你喜欢
        • 2011-07-12
        • 1970-01-01
        • 1970-01-01
        • 2018-11-06
        • 1970-01-01
        • 2013-04-01
        • 1970-01-01
        • 2011-03-31
        • 1970-01-01
        相关资源
        最近更新 更多