您好我正在创建一个网站,我在其中聊天,用户输入被过滤为html实体,唯一没有被转义的是指向图片和网站网址的链接。此外,我添加了一些在初始html编码后也被过滤掉的表情符号,这就是问题
我的笑脸对象里面有一个关键":/": "sprite-uncertain"
的笑脸
这明显与http://,ftp://等等冲突......
下面是我目前使用的代码,作为第2阶段编码 - 代替表情符号:
var escapeRegExp = function( string ) {
return string.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
}
var replaceAll = function( string, find, replace ) {
return string.replace(new RegExp(escapeRegExp(find), 'gi'), replace);
}
var filterEmoticons = function( str ) {
var emoticons = {
"o:)": "sprite-angel",
">:(": "sprite-angry",
":}": "sprite-aww",
"^~^": "sprite-aww2",
"{blush}": "sprite-blushing",
":<": "sprite-childish",
":s": "sprite-confused",
"{creepy}": "sprite-creepy",
":'(": "sprite-crying",
"{cthulu}": "sprite-cthulhu",
":3": "sprite-cute",
"{devil}": "sprite-devil",
">_<": "sprite-gah",
">o<": "sprite-gah2",
":o": "sprite-gasping",
"$_$": "sprite-greedy",
":d": "sprite-grinning",
";d": "sprite-grinning-winking",
":>": "sprite-happy",
"<:": "sprite-happy2",
":.": "sprite-happy3",
"<3": "sprite-heart",
"o.O": "sprite-huh",
"O.o": "sprite-huh2",
":*": "sprite-kiss",
"{lol}": "sprite-laughing",
"{lips}": "sprite-lips",
"{mad}": "sprite-madness",
"{malicious}": "sprite-malicious",
"{sick}": "sprite-sick",
":)": "sprite-smiling",
":|": "sprite-speechless",
">:)": "sprite-spiteful",
"{stupid}": "sprite-stupid",
"b)": "sprite-sunglasses",
"d:": "sprite-terrified",
"{win}": "sprite-thumb-up",
"{fail}": "sprite-thumb-down",
"-_-": "sprite-tired",
":p": "sprite-tongue-out",
"xd": "sprite-tongue-out-laughing",
":b": "sprite-tongue-out-left",
"p:": "sprite-tongue-out-up",
"b:": "sprite-tongue-out-up-left",
";p": "sprite-tongue-out-winking",
":/": "sprite-uncertain",
":\\": "sprite-uncertain2",
":(": "sprite-unhappy",
";)": "sprite-winking",
"x3": "sprite-x3",
";3": "sprite-cute-winking"
};
for ( var i in emoticons ) {
str = replaceAll( str, i, '<em class="sprite '+emoticons[i]+'"></em>' );
}
return str;
}
我不得不承认我对regexp并不是那么好。 如果“:/”是网址的一部分,有没有办法阻止替换/编码?
答案 0 :(得分:0)
试一试。有时,当逻辑事物不起作用时,我们需要做一些技巧或使用一些快速修复。
想法是:
1)在您的第2阶段编码之前添加另一个阶段 - 替换表情。阶段是掩盖对象,这会给解决方案带来麻烦。
例如:将 https:// 转换为替换表情时不会匹配的内容
k=$('#regex_string').val()
var mask_unmaskStringObj = {
"https://":"httpsMask",
"http://": "httpMask",
"ftp://":"ftpMask"
}
for(each in mask_unmaskStringObj) {
//match https://, http://, ftp:// etc
//and replace to httpsMaskString, httpMaskString, ftpMaskString etc
k = k.replace(new RegExp(each,'g'), function() {
return mask_unmaskStringObj[each]
})
}
$('#outputEn').val(k)
2)更换你的笑脸 - 顺利,没有任何问题,如 https ,因为现在他们没有任何冲突的字符串。
3)重置您的蒙面字符串
for(each in mask_unmaskStringObj) {
//Match httpsMaskString, httpMaskString, ftpMaskString etc
//and replace it to match https://, http://, ftp:// etc
k = k.replace(new RegExp(mask_unmaskStringObj[each],'g'), function() {
return each
})
}