使用正则表达式替换javascript中的情感字符

时间:2014-06-14 14:58:16

标签: javascript jquery regex

我有以下JavaScript代码。

var emoticons = {
    ':)': '<span class="emoticon emoticon_smile"></span>',
    ':-)': '<span class="emoticon emoticon_smile"></span>',
    ':(': '<span class="emoticon emoticon_sad"></span>',
    ':d': '<span class="emoticon emoticon_bigSmile"></span>',
    ':D': '<span class="emoticon emoticon_bigSmile"></span>'
}

现在要用给定文本中的span替换情感我正在使用以下函数

function Emotions (text) {
    if (text == null || text == undefined || text == "") return;
    var pattern = /[:\-)(D/pPy@'*]+/gi;
    return text.replace(pattern, function (match) {
        return typeof emoticons[match] != 'undefined' ?
           emoticons[match] :
           match;
    });
}

现在上面的代码工作正常。如果我在下面的函数中传递文本

Emotions("Hey this is a test :( :(");
看到2个情绪之间的空间特征。 但如果我删除两种情感之间的空间,那么它就不起作用。如下所示

Emotions("Hey this is a test :(:(");

我的正则表达式有问题,但我无法弄明白。

5 个答案:

答案 0 :(得分:6)

/:-?[()pPdD]/gi

括号中的字符是posibilites并按顺序保留

答案 1 :(得分:1)

表达式无法判断“:( :(”应该被视为两个“块”,因为“:( :(”完全满足你的正则表达式pattern

例如,如果您知道所有表情符号都以冒号开头(:),您可以使用以下表达式来检查表情符号“块”

:[\-)(D/pPy@'*]+(冒号现在位于角色类前面)

答案 2 :(得分:0)

当您删除空格时,您的整个情感序列:(:(与您的模式/[:\-)(D/pPy@'*]+/匹配(作为序列)。由于没有与:(:(关联的范围,因此不会返回任何内容。

你应该找到一种方法来划分你的角色序列(例如在你的模式前添加一个像/ [:\-)(D/pPy@'*]+/这样的空格,但是在这种情况下不要忘记在你面前添加一个空格跨度)。

答案 3 :(得分:0)

尝试将正则表达式更改为

var pattern = /:[\-)(D/pPy@'*]+/gi;

答案 4 :(得分:0)

使用此表达式搜索,您的代码将起作用

var pattern = /:[( - )dD] + / gi;