最近做一个项目,需要对表情的标签进行转换。场景是这样的。
用户输入文字,并插入了表情,不过表情是用特定的标签字符表示。点击发送的时候,需要将这些特定的标签进行最后的转化。如果用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, ""); }