【问题标题】:retrieving NSString from array in iPhone从 iPhone 的数组中检索 NSString
【发布时间】:2011-09-22 09:25:15
【问题描述】:

我有一个数组,其中包含地图上路线的描述。我通过解析 JSON 得到了这个数组。我的数组包含这种格式的字符串:

    "<b>Sri Krishna Nagar Rd</b> \U306b\U5411\U304b\U3063\U3066<b>\U5317\U6771</b>\U306b\U9032\U3080",


"\U53f3\U6298\U3057\U3066\U305d\U306e\U307e\U307e <b>Sri Krishna Nagar Rd</b> \U3092\U9032\U3080",


        "\U5927\U304d\U304f\U5de6\U65b9\U5411\U306b\U66f2\U304c\U308a\U305d\U306e\U307e\U307e <b>Bailey Rd/<wbr/>NH 30</b> \U3092\U9032\U3080<div class=\"\">\U305d\U306e\U307e\U307e NH 30 \U3092\U9032\U3080</div><div class=\"google_note\">\n<b landmarkid=\"0x39ed57bfe47253b7:0x779c8bf48892f269\" class=\"dir-landmark\">Petrol Bunk</b>\U3092\U901a\U904e\U3059\U308b<div class=\"dirseg-sub\">\Uff083.9&nbsp;km \U5148\U3001\U53f3\U624b\Uff09</div>\n</div>",

现在我想从这个数组中获取地点的名称,例如Sri Krishna Nagar RdNH 30 Petrol Bunk。前两个应该给Sri Krishna Nagar Rd,最后一个应该给NH 30 Petrol Bunk 我怎样才能得到这样的结果。任何帮助将不胜感激。提前致谢。

再次,假设我有这种格式的字符串..."\U5de6\U6298\U3059\U308b" 没有任何地名。我将如何处理这种情况。

【问题讨论】:

  • 您知道您将地名放在哪个位置吗?我的意思是有什么具体的命令吗?
  • 我还有一个疑问,上面的字符串是数组的单个索引的内容?
  • 你好 surya Kant,你现在到了吗?
  • 感谢您的 +ve 响应。现在,我得到了那个地名。
  • 我已经更新了,请查收。但最后如果你在“你的地方字符串”中得到空字符串,那么请正确处理它。

标签: iphone nsstring nsarray


【解决方案1】:
    You can get like below:


  NSString *strName=[yourArray objectAtIndex:index];

    NSString *yourPlaceString=[[strName componentsSeparatedByString:@"<b>"] objectAtIndex:1];
    yourPlaceString=[[yourPlaceString componentsSeparatedByString:@"</b>"] objectAtIndex:0];

    you can get all places like this.

【讨论】:

  • 请在2分钟内得到正确的解决方案。
  • 再次,我遇到了一个问题。如果路线没有参考地点的名称,这将不起作用。应用程序在这种情况下崩溃。另外,如果我像这样使用你的代码......它给出的名字就像......“Sri Krishna Nagar Rd \U306b\U5411\U304b\U3063\U3066”,我只想要 Sri Krishna Nagar Rd。我已经编辑了我的问题,请看看...
【解决方案2】:

首先,您应该检查您是否没有任何其他更简洁的 API 可用于查询此数据的服务。如果服务在其 JSON 响应中返回此类垃圾,那么您不应该负责清理这些混乱:服务应该返回一些更有用的文本,如果它是一个真正干净的 API。

接下来,如果你真的没有其他选择,真的需要清理这段文字,你有两个选择:

  • 如果文本是 XHTML(我的意思是真正的 XHTML,符合 XML 标准),您可以使用 NSXMLParser 过滤掉任何标签,只保留字符串中的文本。无论如何,这可能有点过分,所以我真的不推荐它。
  • 您可以使用正则表达式。如果您正在为 iOS4.0+ 进行开发,您可以为此目的使用 NSRegularExpressionclass。棘手的部分是获得正确的正则表达式(如果需要,可以帮助您)
  • 您可以使用NSScanner(自2.0 IIRC 起在iOS 中可用)扫描字符串中的字符并对其进行解析。如果您不是正则表达式专家,这可能更容易理解并且要走的路,所以我推荐这种方法

例如,如果您选择NSScanner解决方案,您可以扫描您的字符串以查找字母数字字符集中的字符,以扫描字母和数字并累积它(您也可以在您的NSCharacterSet中添加标点符号如果需要,您正在使用)。当 NSScanner 遇到诸如 unicode 字符 \Uxxxx 或 &lt;&gt; 之类的字符时,您将停止 NSScanner。当您遇到&lt; 时,您可以要求NSScanner 忽略直到下一个&gt; 的字符,然后再次开始扫描字母数字字符并累积......等等直到字符串的末尾。


最后,如果你真的在收到的响应字符串中找到了一个模式,比如你的地名总是在第一个 &lt;b&gt;&lt;/b&gt; 对之间(但你必须确定这一点),你可以以其他方式处理它,例如:

  • 使用 &lt;b&gt; 文本作为分隔符分割字符串(例如 componentsSeparatedByString
  • 或向rangeOfString 询问字符串&lt;b&gt;,然后询问字符串&lt;/b&gt;,一旦你有了他们的位置,只从原始字符串中提取substringWithRange 以仅提取地名(使用@ 987654340@ 会比componentsSeparatedByString 更快,因为它会在第一次发现时停止)

【讨论】:

    【解决方案3】:

    这看起来像是一个编码问题 - 你能把源或目标的编码更改为不同的格式吗?当 UTF-8 关闭时,我在德语 ö ä ü 字符上遇到了类似的问题....

    【讨论】:

    • 那里没有编码问题。接收到的文本/响应包含 unicode 字符,但这不是编码问题(相反,使用 \Uxxxx 表示法可以避免编码混淆)
    • 没错,但如果那些字符易于阅读,它们可能更容易理解,并且我认为它们被识别为简单的关键字,只需在解析过程中跳过......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多