Прежде всего, вы должны проверить, нет ли другого доступного 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
, потому что остановится при первом обнаружении вхождения)