Regexp表情符号替换失败,字符串中的url

时间:2014-07-14 14:02:37

标签: javascript regex node.js

您好我正在创建一个网站,我在其中聊天,用户输入被过滤为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并不是那么好。 如果“:/”是网址的一部分,有没有办法阻止替换/编码?

1 个答案:

答案 0 :(得分:0)

试一试。有时,当逻辑事物不起作用时,我们需要做一些技巧或使用一些快速修复。

js-fiddle

想法是:

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
    })
}