【发布时间】:2015-12-31 14:16:01
【问题描述】:
我已经创建了基于this project 的聊天应用程序,但我现在想做的是为表情符号提供解析器。例如,如果我写如下内容:
What's up? :)
这可以被解析为“怎么了?[图片在这里]”。此外,当有人访问房间时,也需要解析来自该房间的所有消息。最简单的方法是什么?
附:应用没有数据库。
【问题讨论】:
我已经创建了基于this project 的聊天应用程序,但我现在想做的是为表情符号提供解析器。例如,如果我写如下内容:
What's up? :)
这可以被解析为“怎么了?[图片在这里]”。此外,当有人访问房间时,也需要解析来自该房间的所有消息。最简单的方法是什么?
附:应用没有数据库。
【问题讨论】:
您可以使用基于正则表达式或任何您想要的简单字符串插值。
假设我们有一张微笑地图:
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"
【讨论】:
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/" 必须是笑脸图像的根路径。 笑脸地图必须是一个以文件名为键的对象,而笑脸要被替换为一个数组。
insertSmiley("Hello World :-)")
结果:
Hello World <img src="http://example.com/images/smile.png">
【讨论】: