最近做一个项目,需要对表情的标签进行转换。场景是这样的。
用户输入文字,并插入了表情,不过表情是用特定的标签字符表示。点击发送的时候,需要将这些特定的标签进行最后的转化。如果用for循环等,就算能替换好,也会很费力。所以,就想到用正则表达式。只是正则表达式用的少,几乎不会用。于是在网上查啊查,找啊找。再根据自己的需求。终于把正则表达式给搞出来了。所以特意总结出来以后备用。

场景展示:
输入框内容:{/wx}hi,我来着神魔大陆{/fly} 。。{/jy}你呢。
需要转换的结果:hi,我来着神魔大陆 。。你呢。

贴出关键代码:

        private function translateMsg(str:String):Array
        {
            var reg:RegExp = /{\/.*?}/g    ;
            var len:int = 0;
            str = str.replace(reg,
                function():String
                {
                    var msg:String = arguments[0] as String;
                    msg = msg.slice(1,(msg.length-1));
                    msg = "<img src=\"" + msg + "\"/>";
                    len +=msg.length;
                    return (msg);
                });    
            len = str.length - len + 1;
            return [str,len];
        }

 

该函数,不仅返回了转化的字符,并且将转化的字符的图片所占字符的长度也计算出来了。之所以减一,是想让图片也占一个字符的长度。

在做聊天的项目的时候,经常会限制字符串的长度。而中文英文所对应的字符串长度不对等。也就是中文一个汉字是一个长度,而英文一个字母也是一个长度。这样在限制字符长度的时候,不对等。于是,转换字符长度也成为必要。将一个中文字符当做两个字符来计算,这样就比较舒适合理了。下边一个函数,就是获取特定长度的字符串。

        private function getStringByLength(str:String , maxLen:int):String
        {
            var ba:ByteArray = new ByteArray ;
            ba.writeMultiByte (str, "");
            if (ba.length <= maxLen) return str;
            ba.position = 0 ;
            return ba.readMultiByte(maxLen, "");
        }