【问题标题】:How do I find non-length-specified substrings in a string in Objective-C?如何在 Objective-C 中的字符串中找到未指定长度的子字符串?
【发布时间】:2011-05-14 02:15:11
【问题描述】:

我有生以来第一次尝试为开源软件做出贡献。因此,我试图在this ticket 上提供帮助,因为它似乎是一张不错的“初学者票”。

我已成功从 Twitter API 中获取字符串:但是,它采用以下格式:

<a href="http://twitter.com" rel="nofollow">Tweetie for Mac</a>

我想从这个字符串中提取 URL (http://twitter.com) 和 Twitter 客户端的名称 (Tweetie for Mac)。我如何在 Objective-C 中做到这一点?由于 URL 不同,我无法搜索指定的索引,同样适用于客户端名称。

【问题讨论】:

    标签: objective-c string substring


    【解决方案1】:

    你知道这部分字符串是一样的:

    <a href="...">...</a>
    

    所以你真正想要的是搜索第一个 " 和结束 &gt; 的 a 标记的开头。

    执行此操作的最简单方法是查找引号中的内容(请参阅this link 了解如何搜索 NSStrings),然后获取倒数第二个 &gt; 之后的文本作为您的真实姓名。

    您也可以使用NSXMLParser,因为它专门适用于 XML,但在这种情况下这可能有点过头了。

    【讨论】:

      【解决方案2】:

      我没有查看 Adium 源代码,但您应该检查是否有任何可用的类别可以扩展,例如NSString 具有将 html/xml 解析为更多可用结构的方法,例如节点树。然后您可以简单地遍历树并搜索所需的属性。

      如果没有,您可以通过将字符串划分为标记(标签打开、标签关闭、标签属性、引用字符串等)自行解析,然后查找所需的属性。或者,如果字符串始终由单个 html 锚元素组成,您甚至可以使用正则表达式。

      我知道已经多次讨论过正则表达式根本不适用于 html 解析,但这是一个实际合理的特定场景。比运行成熟的通用 html/xml 解析器要好。正如 slycrel 所说,那将是矫枉过正。

      【讨论】:

      • 同意 - 类似的问题可能已经在项目的某个阶段得到解决。找到类似的东西会给你灵感并帮助你匹配他们的风格。
      【解决方案3】:

      假设您已经拥有 HTML 链接并且没有解析整个 HTML 页面。

      //Your HTML Link
      NSString *link = [urlstring text];
      
      //Length of HTML href Link
      int length = [link length];
      
      //Range of the first quote
      NSRange firstQuote = [link rangeOfString:@"\""];
      
      //Subrange to search for another quote in the HTML href link
      NSRange nextQuote = NSMakeRange(firstQuote.location+1, length-firstQuote.location-1);
      
      //Range of the second quote after the first
      NSRange secondQuote = [link rangeOfString:@"\"" options:NSCaseInsensitiveSearch range:nextQuote];
      
      //Extracts the http://twitter.com
      NSRange urlRange = NSMakeRange(firstQuote.location+1, (secondQuote.location-1) - (firstQuote.location));
      NSString *url = [link substringWithRange:urlRange];
      
      //Gets the > right before Tweetie for Mac
      NSRange firstCaret = [link rangeOfString:@">"];
      
      //This appears at the start of the href link, we want the next one
      NSRange firstClosedCaret = [link rangeOfString:@"<"];
      NSRange nextClosedCaret = NSMakeRange(firstClosedCaret.location+1, length-firstClosedCaret.location-1);
      
      //Gets the < right after Tweetie for Mac
      NSRange secondClosedCaret = [link rangeOfString:@"<" options:NSCaseInsensitiveSearch range:nextClosedCaret];
      
      //Range of the twitter client
      NSRange rangeOfTwitterClient = NSMakeRange(firstCaret.location+1, (secondClosedCaret.location-1)-(firstCaret.location));
      NSString *twitterClient = [link substringWithRange:rangeOfTwitterClient];
      

      【讨论】:

      • 谢谢,这看起来很不错。我会看一下文档,这样我才能真正了解您在做什么并学到一些东西,而不仅仅是复制粘贴,哈哈。
      • 如果这有助于将其标记为答案。如果它不适合你,请告诉我。
      • 它有帮助,并且通过一些小的修改可以正常工作。标记为答案。但是,这会导致任何内存泄漏或类似的事情吗?因为我注意到使用此代码运行 Adium 时,我的 MacBook 运行速度明显变慢。
      • 还是因为我正在构建和运行 Debug 版本?
      猜你喜欢
      • 1970-01-01
      • 2022-01-04
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-24
      • 1970-01-01
      • 2017-05-12
      相关资源
      最近更新 更多