Используйте RegEx или NSScanner в Obj-C для преобразования символов новой строки в HTML-маркеры

Мое приложение обращается к плохому веб-сервису, который возвращает вывод, подобный этому:

Title\n\nInfo1\nInfo2\nInfo3\n ...

Чтобы уточнить, текст не буквально ...и информация не буквально пронумерована, я просто хотел показать, что они различны.

Я хочу отобразить это в UIWebView как это:

<p><b>Title</b><ul><li>Info1</li><li>Info2</li><li>Info3</li></ul></p>

Как я могу сделать это, используя либо NSRegularExpression или же NSScanner? Я запутался NSRegularExpression и потому, что я не знаю правильное выражение для использования, и я не уверен, как я получаю доступ к результатам, чтобы поместить его в аккуратно отформатированную строку.

Наивно логика будет примерно такой:

  1. Найти весь текст между символом 0 и первым (единственным) вхождением \n\nи вписать это в формат @"<p><b>%@</b><ul>",matchedString
  2. Пока есть текст, найдите весь текст между текущим символом и следующим появлением \n (один) и вписывается в формат @"<li>%@</li>"
  3. Когда нет \n слева, добавить @"</ul></p>" и назовите это днем.

Посоветуйте, пожалуйста, как я могу реализовать эту логику или альтернативно закодировать ее в регулярном выражении.

Ответ реализован

Я просто хотел опубликовать мою импровизированную реализацию ответа на случай, если кто-нибудь в будущем застрянет:

NSArray *parts = [self.dogFoodBenefits componentsSeparatedByString:@"\n"];
NSString *benefitsString = [NSString stringWithFormat:@"<h4>Benefits</h4><b>%@</b><p><ul>",[parts objectAtIndex:0]];
for (int i = 2; i < [parts count]; i++) {
    if ([[parts objectAtIndex:i] length] > 1)
        benefitsString = [benefitsString stringByAppendingFormat:@"<li>%@</li>",[parts objectAtIndex:i]];
}
benefitsString = [benefitsString stringByAppendingString:@"</ul></p>"];

2 ответа

Решение

Я думаю, что вам будет легче просто разделить строку на \n\n с помощью componentsSeparatedByString: метод:

NSArray *parts = [webTextStr componentsSeparatedByString:@"\n\n"];
// Use the initial or the only element inside <b></b> tag
// Put the remaining elements, if any, in the <li></li> tags

Вы можете использовать метод -[NSString componentsSeparatedByString:], чтобы получить то, что вы хотите, в виде массива строк.

Другие вопросы по тегам