2012-05-29 19 views
4

我已经与图像的表情符号代替文字表情符号等功能使替换功能不区分大小写

我怎样才能让这个不区分大小写? 我一直在使用 “GI” 和 “IG” 的替代品尝试,但它一点儿也不显得有所作为

var emots = { 
    ':)' : 'smile', 
    ':-)' : 'smile', 
    ';)' : 'wink', 
    ';-)' : 'wink', 
    ':(' : 'downer', 
    ':-(' : 'downer', 
    ':D' : 'happy', 
    ':-D' : 'happy', 
    '(smoke)' : 'smoke', 
    '(y)' : 'thumbsup', 
    '(b)' : 'beer', 
    '(c)' : 'coffee', 
    '(cool)' : 'cool', 
    '(hehe)' : 'tooth', 
    '(haha)' : 'tooth', 
    '(lol)' : 'tooth', 
    '(pacman)' : 'pacman', 
    '(hmm)' : 'sarcastic', 
    '(woot)' : 'woot', 
    '(pirate)' : 'pirate', 
    '(wtf)' : 'wtf' 
}; 

function smile(str){ 
    var out = str; 
     for(k in emots){ 
      out = out.replace(k,'<img src="/emoticons/'+emots[k]+'.gif" title="'+k+'" />','g'); 
     } 
    return out; 
}; 
+0

“我”只能在firefox中工作,因为我看到它 – mowgli

回答

2

变化:

out = out.replace(k,'<img src="/emoticons/'+emots[k]+'.gif" title="'+k+'" />','g'); 

要:

out = out.replace(new RegExp(k.replace(/[-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"), 'ig'), '<img src="/emoticons/'+emots[k]+'.gif" title="'+k+'" />'); 

从这个答案中取出正则表达式转义函数Escape string for use in Javascript regex

+0

那里面(k在emots){)? – mowgli

+0

@mowgli是的,没错。它只是从你的替换函数中取出标志并将它们转换为正则表达式的标志。 'escapeRegExp'转义所有特殊的正则表达式字符,尽管你只需要用你的输入来转义'('和')'',最好是在你添加新的表情符号时使用':]'或其他字符上。 – Paulpro

+0

好吧;)但我想...在循环内创建一个函数是不是错了?它会被创建(或检查,而不是重新创建,我不知道)每个字母我猜 – mowgli

1

这比它有点棘手表面上的ppears。以下是完整的解决方案。为了简单和高效,它只对目标字符串使用一次正则表达式搜索。

注意,因为它是不区分大小写(例如,(hehe)(HeHe)被视为相同),:-d也一样对待:-D

var emots = { 
    ':)' : 'smile', 
    ':-)' : 'smile' 
    // Add the rest of your emoticons... 
}; 

// Build the regex that will be used for searches 
var emotSearch = []; 
for (var p in emots) { 
    if (emots.hasOwnProperty(p)) { 
     emotSearch.push(p.replace(/[-[{()*+?.\\^$|]/g, '\\$&')); 
     if (p !== p.toLowerCase()) { 
      emots[p.toLowerCase()] = emots[p]; 
     } 
    } 
} 
emotSearch = RegExp(emotSearch.join('|'), 'gi'); 

function smile(str) { 
    return str.replace(emotSearch, function ($0) { 
     var emot = $0.toLowerCase(); 
     if (emot in emots) { 
      return '<img src="/emoticons/' + emots[emot] + '.gif" title="' + $0 + '" />'; 
     } 
     return $0; 
    }); 
} 
+0

哇很多代码..没有尝试过。另一个较短的答案是完美的。简单就好;) – mowgli

+0

就这样吧。尽管如此,您知道,您提到的另一个答案需要对emot的每个属性单独进行搜索和替换,这会显着降低效率,并且会随着添加更多表情符号来搜索而变得更慢。它还使用不必要的详细正则表达式来转义正则表达式元字符。 – slevithan

-2

或者只是在输入之前使用.toLowerCase()运行检查之前?