извлечение NSString из массива в iPhone - PullRequest
3 голосов
/ 22 сентября 2011

У меня есть массив, который содержит описание маршрута на карте. Я получил этот массив путем анализа 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 Rd, NH 30 Petrol Bunk. Первые два должны дать Sri Krishna Nagar Rd, а последнее должно дать NH 30 Petrol Bunk Как я могу получить такой результат. Любая помощь будет оценена. Заранее спасибо.

Опять же, предположим, что у меня есть строка в этом формате ... "\U5de6\U6298\U3059\U308b", у которой нет названия места. Как я буду обрабатывать эти сценарии.

Ответы [ 3 ]

5 голосов
/ 22 сентября 2011
    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.
3 голосов
/ 22 сентября 2011

Прежде всего, вы должны проверить, нет ли другого доступного API-интерфейса для службы, запрашивающей эти данные. Если служба возвращает такой мусор в своем ответе JSON, это не должно быть вашей обязанностью убирать этот беспорядок: служба должна возвращать некоторый текст, который более пригоден для использования, если это действительно чистый API.

Далее, если у вас действительно нет другого выбора и вам действительно нужно очистить этот текст, у вас есть два варианта:

  • Если текст XHTML (я имею в виду настоящий XHTML, соответствующий стандарту XML), вы можете использовать NSXMLParser, чтобы отфильтровать любые теги и сохранить только текст из вашей строки. В любом случае, это может быть слишком много для этого, поэтому я не рекомендую это делать.
  • Вы можете использовать регулярные выражения . Если вы разрабатываете iOS4.0 +, вы можете использовать класс NSRegularExpression для этой цели. Самое сложное - получить правильное регулярное выражение (может помочь вам в этом, если это необходимо)
  • Вы можете использовать NSScanner класс (который доступен в iOS начиная с версии 2.0 IIRC), чтобы сканировать символы в вашей строке и анализировать ее. Это, вероятно, легче понять, и если вы не являетесь экспертом по регулярным выражениям, то это лучший путь, поэтому я рекомендую этот подход

Например, если вы выберете решение NSScanner, вы можете отсканировать вашу строку на наличие символов в алфавитно-цифровом наборе символов, отсканировать буквы и цифры и накопить ее (вы также можете добавить знаки пунктуации к вашему NSCharacterSet вы используете при необходимости) . У вас будет NSScanner для остановки, когда он встретит символы, такие как символы Юникода \ Uxxxx или такие как < и >. Когда вы встречаете <, вы можете затем попросить NSScanner игнорировать символы до следующего >, затем снова начать сканировать буквенно-цифровые символы и накапливать ... и так далее до конца строки.


Наконец, если вы действительно найдете шаблон в получаемой вами строке ответа, например, если ваши географические названия всегда находятся между первой парой <b> и </b> (но вы должны быть в этом уверены), вы можете обрабатывать это другими способами, например:

  • разделение вашей строки с использованием текста <b> в качестве разделителя (например, componentsSeparatedByString)
  • или запросить rangeOfString для строки <b>, а затем для строки </b> и, как только вы определите их позицию, извлеките substringWithRange только из исходной строки, чтобы извлечь только название места (используя rangeOfString будет быстрее, чем componentsSeparatedByString, потому что остановится при первом обнаружении вхождения)
1 голос
/ 22 сентября 2011

Это похоже на проблему кодирования - вы можете изменить кодировку источника или цели на другой формат.У меня были похожие проблемы с немецкими символами, когда UTF-8 был выключен ....

...