Actionscript — использование регулярного выражения и TextFormat для стилизации текста между тегами HTML.
-
14-11-2019 - |
Вопрос
Я некоторое время боролся с этой проблемой:
У меня есть строка, содержащая HTML, и я использую регулярное выражение для получения символов между тегами.Затем я пытаюсь применить TextFormat к этим символам.
Проблема в том, что я использую свойство «htmlText» TextField вместо свойства «text» (потому что я не хочу, чтобы теги HTML были видимыми).Итак, индекс символов, возвращаемый из регулярного выражения, неверен, когда я применяю TextFormat.
Вот пример кода, иллюстрирующий проблему:
var txt:String = "<b>Sample</b> string with bold text";
var tf:TextField = new TextField();
addChild(tf);
tf.htmlText = txt;
var format:TextFormat = new TextFormat();
format.bold = true;
var regExp:RegExp = /<b>(.*?)<\/b>/g;
var match:Object = regExp.exec(txt);
while (match != null) {
tf.setTextFormat(format, match.index, match.index + match[0].length);
match = regExp.exec(txt);
}
Это дает мне:
"Пример строки с жирным текстом"
вместо желаемого:
"Образец строка с жирным текстом"
потому что match[0].length
семь символов слишком длинны из-за HTML-тегов <b></b>
.
Что я могу с этим поделать?Спасибо!
Решение
Используя TextField.htmlText, <b>
теги должны выделять жирный текст без необходимости использования TextFormat.bold или регулярного выражения, при условии, что вы встраиваете правильные шрифты (или используете шрифты устройства).
Но я знаю, что иногда возникают проблемы с поддержкой HTML в TextFields в сочетании с обработкой шрифтов, и, возможно, ваша реальная ситуация более сложна, чем пример с жирным текстом.В этом случае я бы рекомендовал использовать Таблица стилей форматирование вместо комбинации regexp/TextFormat.Помимо проблемы с несоответствием смещения, с которой вы столкнулись, я считаю, что объединение двух разных подходов к форматированию текста — HTML и TextFormat — рискует создать другие проблемы, тогда как использование HTML-текста и StyleSheet предназначено для совместного использования.
Я начал писать пример использования StyleSheet/htmlText, но поскольку <b>
в любом случае должно работать, без стилей, получилось немного странно, поэтому я поцарапал.Но дайте мне знать, если вам понадобится пример кода.
Другие советы
tf.setTextFormat(format, match.index, match.index + match[1].length);