将文本导入/转换为 TextFlow 时,是否可以定义生成元素的基于 RegEx 的解析器?
例如:
- 每当匹配电子邮件地址时,我都想创建一个 LinkElement。
- 我想在匹配笑脸时创建一个 InlineGraphicElement :)
问候,
马蒂
将文本导入/转换为 TextFlow 时,是否可以定义生成元素的基于 RegEx 的解析器?
例如:
问候,
马蒂
我知道的最简单的方法是获取文本并使用一系列正则表达式来嵌入 HTML。然后从 HTML 创建一个 TextFlow 并将其分配给 RichEditableText(或您正在使用的任何组件)。就像是:
var emailRE:RegExp = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
var smileyRE:RegExp = /:\)/g;
var sample:String = "Email john@doe.com with smiley :) example.";
var result:String = '';
while (emailRE.test(sample)) {
result = sample.replace(emailRE, "<a href='event:emailClicked'><font color='0x0000DD'>$&</font></a>");
}
if (result.length > 0) {
sample = result;
}
var result2:String = '';
while (smileyRE.test(sample)) {
result2 = sample.replace(smileyRE, "<img src='smiley.png'/>");
}
if (result2.length > 0) {
sample = result2;
}
richEditableTextComponent.textFlow = TextConverter.importToFlow(sample, TextConverter.TEXT_FIELD_HTML_FORMAT);
richEditableTextComponent.textFlow.addEventListener("emailClicked", emailClickedHandler, false, 0, true);
然后点击处理程序将类似于:
private function emailClickedHandler(event:FlowElementMouseEvent):void {
var emailAddress:String = LinkElement(event.flowElement).getFirstLeaf().text;
// do something with emailAddress
}
您还可以通过解析电子邮件/笑脸的字符串并构建 SpanElement、LinkElement 和 InlineGraphicElement 来手动构建基于字符串的 TextFlow,但这对程序员来说要麻烦得多,但是我已经看到了对它的需求(尤其是 RichEditableText并且必须在用户键入键时解析每个 SpanElement 以查看笑脸是否匹配并替换为图形;在此处使用 HTML 无济于事,因为您不想重新分配整个 TextFlow 对象,因为它会导致完全重绘整个流程,而不是只更新必须更新的内容,例如将单个 SpanElement 拆分为一系列 SpanElement - InlineGraphicElement - SpanElement)。
希望这可以帮助!
贾斯汀