Несколько жирных тегов в NSMutableAttributedString с циклом?

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

string descriptionBody = "This is a <b>text</b> with multiple <b>bold</b> tags";
var content = new NSMutableAttributedString(descriptionBody);

int i = 0;
while (i < Regex.Matches(descriptionBody, "<b>").Count) {
    int start = descriptionBody.IndexOf("<b>", StringComparison.Ordinal);
    int end = descriptionBody.IndexOf("</b>", StringComparison.Ordinal);
    int length = end - start;

    var boldFirst = new NSRange(start, 3);
    var boldLast = new NSRange(end, 4);

    StringExtensions.ParseBoldTags(content, 14, start + 3, length - 3);
    content.Replace(boldLast, string.Empty);
    content.Replace(boldFirst, string.Empty);
    i++;
}

Я бы не советовал попытка разобрать HTML с помощью RegEx.

Lews Therin 22.10.2018 21:19

Это была моя первая идея, но если я разбираю ее в HTML в iOS, она идет с новым римским шрифтом Times, важно анализировать только полужирные теги.

Jan 22.10.2018 21:23

Какое отношение имеет синтаксический анализ HTML к iOS или шрифтам?

Lews Therin 22.10.2018 21:28

AngleSharp - гораздо лучший инструмент для синтаксического анализа HTML.

Jason 22.10.2018 21:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
60
1

Ответы 1

Ваши начальные и конечные значения одинаковы для каждого цикла сопоставления. Вы можете использовать объект Group в MatchCollection для получения каждого индекса и длины совпадения.

string descriptionBody = "This is a <b>text</b> with multiple <b>bold</b> tags";
var content = new NSMutableAttributedString(descriptionBody);

foreach (Group match in Regex.Matches(descriptionBody, "<b>"))
{
    int start = match.Index;
    int end = match.Index + match.Length;
    var boldEnd = Regex.Matches(descriptionBody.Substring(end), "</b>")[0];
    //~~~
}

Обновлять:

Если ваша конечная цель - удалить полужирные теги и создать NSAttributedString без какой-либо разметки, вы можете вместо этого просто использовать Regex.Replace:

var strippedStr = Regex.Replace(descriptionBody, "<b>|</b>", "");
var content = new NSAttributedString(strippedStr);

Этот код выделяет жирным шрифтом только теги <b>, но не текст внутри этих тегов.

Jan 22.10.2018 21:43

@Jan Вам просто нужно выделить следующее завершающее жирным шрифтом совпадение, я добавил еще одно совпадение в свой пример, чтобы помочь.

SushiHangover 22.10.2018 21:53

Я действительно запутался здесь, лол, я думаю, мне нужно еще кофе

Jan 22.10.2018 21:58

@Jan Смотрите мое обновление, это все, что вы пытаетесь сделать?

SushiHangover 22.10.2018 22:19

Нет, текст также должен быть полужирным между ними, иначе в нем нет смысла.

Jan 22.10.2018 22:31

@Jan Ваш код просто заменяет теги на string.Empty.

SushiHangover 22.10.2018 22:41

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