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 时才能点击。