TextLayout Framework 匹配超链接
TextLayout Framework 中的文字通常是放在 SpanElement 中,因此写了一个查找 SpanElement 中的链接并替换为 LinkElement 的函数,由于不擅长正则表达式,借鉴了他人的代码,难免功能有所欠缺,有待完善。
private function checkLink(element:ParagraphElement):ParagraphElement
{
for(var i:int = 0;i < element.numChildren;i++)
{
var child:FlowElement = element.getChildAt(i);
if(child is SpanElement)
{
var regExp:RegExp = /(http(s)?:\/\/(?:(?:\d+\.\d+\.\d+\.\d+)|(?:(?:[\w-]+\.)+(?:[a-z,A-Z][\w-]*)))(?:[1-9][0-9]*)?(?:\/(?:[\w-.\/:%+@&=]+[\w- .\/?:%+@&=]*)?)?(#(.*))?)/ig;
var str:String = SpanElement(child).text;
if(regExp.test(str))
{
element.removeChild(child);
var rest:Array = str.split(regExp);
for each(var item:String in rest)
{
if(null == item || "" == item)
{
continue;
}
var span:SpanElement = new SpanElement();
span.text = item;
regExp.lastIndex = 0;
if(regExp.test(item))
{
var link:LinkElement = new LinkElement();
link.addChild(span);
link.addEventListener(FlowElementMouseEvent.CLICK,linkClick);
element.addChild(link);
}
else
{
element.addChild(span);
}
}
}
}
}
return element;
}
另有一点需要注意,使用 RichEditableText、TextArea 等基于 Text Layout Framework 的富文本组件时需要将 editable 设置为 false,否则,LinkElement 只有在按住 Ctrl 时才能点击。