【问题标题】:Actionscript - using regular expression and TextFormat to style text between HTML tagsActionscript - 使用正则表达式和 TextFormat 在 HTML 标记之间设置文本样式
【发布时间】:2012-03-02 01:32:01
【问题描述】:

我已经为这个问题苦苦挣扎了一段时间:

我有一个包含 HTML 的字符串,我正在使用正则表达式来获取标签之间的字符。然后我尝试将 TextFormat 应用于这些字符。

问题是我使用的是 TextField 的“htmlText”属性而不是“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 标签&lt;b&gt;&lt;/b&gt;

对此我能做些什么?谢谢!

【问题讨论】:

    标签: regex actionscript textfield htmltext textformat


    【解决方案1】:

    使用 TextField.htmlText,&lt;b&gt; 标签应该提供粗体文本,不需要 TextFormat.bold 或 regexp,前提是您嵌入了正确的字体(或使用设备字体)。

    但是,我知道 TextFields 中的 HTML 支持与字体处理相结合有时会出现问题,并且您的实际情况可能比带有粗体文本的示例更复杂。在这种情况下,我建议使用 StyleSheet 格式而不是 regexp/TextFormat 组合。除了您遇到的偏移不匹配问题之外,我相信将两种不同的文本格式化方法(HTML 和 TextFormat)结合起来可能会带来其他问题,而使用 HTML 文本和 StyleSheet 是要一起使用的。

    我开始编写一个使用 StyleSheet/htmlText 的示例,但由于 &lt;b&gt; 无论如何都应该工作,没有样式,它有点奇怪,所以我抓了它。但如果您需要示例代码,请告诉我。

    【讨论】:

    • 谢谢。自从我将 CSS 样式表导入 Flash 已经有好几年了,但我想这是唯一的方法。你是对的,我的情况比我发布的例子更复杂。应用于 标记之间的文本的格式可能是完全不同的(嵌入的)字体。真的,我可以使用任何标签——它只是一个包装器,表示应该对文本应用不同的字体或字体粗细。使用 CSS 的问题在于 CSS 和嵌入的字体都必须更改并保持同步才能正常工作,对吗?我会测试一下。
    【解决方案2】:
    tf.setTextFormat(format, match.index, match.index + match[1].length); 
    

    【讨论】:

    • 太棒了!谢谢你。但是match.index 仍然不正确。使用此字符串尝试上述解决方案:var txt:String = "&lt;span&gt;Sample&lt;/span&gt; string with &lt;b&gt;bold&lt;/b&gt; text and extra tags to make it longer"; 这将为您提供:带有粗体文本和 extra 标记的示例字符串以使其更长因为match.index 包含&lt;span&gt;&lt;/span&gt; 字符。跨度>
    • 我很抱歉。我不知道如何使用 markdown 以更易读的方式对其进行格式化,并且我无法回答自己的问题。
    • 这肯定会更难解决。将 match.index 替换为 tf.text.indexOf(match[1]) 将起作用,但前提是每个单词都是唯一的。您可以通过存储每个结束索引并将其设置为 tf.text.indexOf(match[1],lastEndIndex) 来做得更好,但这仍然不是令人难以置信的。看看我能想出什么。
    • 你看过stackoverflow.com/questions/9502711/…的答案吗?不确定您使用的是 flex 闪光灯还是直闪光灯。
    • 另外,这个来自 adobe 的引用 livedocs.adobe.com/flex/3/html/… 也可以帮助您正确呈现 html 文本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 2015-05-17
    相关资源
    最近更新 更多