我已根据this project创建了聊天应用程序,但我现在要做的是为smilies提供解析器。例如,如果我写的内容如下:
What's up? :)
可以解析为"什么? [image here]" 。此外,当有人访问房间时,也需要解析来自该房间的所有消息。最简单的方法是什么?
P.S。 App没有数据库。
答案 0 :(得分:2)
var smileyMap={
"smile.png":[":)",":-)"],
"sad.png":[":(",":-("]
};
var insertSmiley=function(basePath,smileys){
var replacements=[];
Object.keys(smileys).forEach(function(file){
var _file="<img src=\""+basePath+file+"\"\>";
smileys[file].forEach(function(chars){
var reg=new RegExp(chars.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1"),"g");
replacements.push([reg,_file]);
});
});
return function(text){
return replacements.reduce(function(line,replacement){
return line.replace(replacement[0],replacement[1]);
},text);
}
}("http://example.com/images/",smileyMap);
“http://example.com/images/”必须是笑脸图像的根路径。 smileyMap必须是一个以文件名为键的对象,以及要替换为数组的表情符号。
insertSmiley("Hello World :-)")
结果:
Hello World <img src="http://example.com/images/smile.png">
答案 1 :(得分:2)
您可以使用基于Regex或任何您想要的简单字符串插值。
让我们想象一下,我们有微笑的地图:
const SMILES_MAP = {
':)': 'http://link-to-smiley.png',
':0': 'http://link-to-another-smiley.png'
};
我们还有一个名为message
的消息字符串。让我们构建一个用图像替换所有微笑的函数:
function buildMessage(message) {
let smiles = Object.keys(SMILES_MAP);
smiles.forEach(smile => message = message.replace(smile, SMILES_MAP[smile]));
return message;
}
使用消息参数调用函数并获取结果:
buildMessage("Hello there :)"); // Returns "Hello there http://link-to-smiley.png"