我实现了与表情符号组合键相匹配的javascript函数,并将其替换为span和特定的css类。
我确信我使用所有支持的表情符号测试了系统,所有替换都运行得很好。但现在一些表情符号无法匹配,我无法弄清楚原因。
对于前。表情符号':P'与我的正则表达式不匹配但是':)'它是。
匹配和替换字符的功能是:
/**
* Replace combination of chars with emoticons
* @param rawText string
* @returns string
* @private
*/
chatWindow.prototype._processEmoticons = function(rawText) {
var fbEmoticonHolder = '<span class="emoticon :HOLDER:"></span>';
var replacementMap = {
':)' : fbEmoticonHolder.replace(':HOLDER:', 'smile'),
':-)' : fbEmoticonHolder.replace(':HOLDER:', 'smile'),
':(' : fbEmoticonHolder.replace(':HOLDER:', 'sad'),
':-(' : fbEmoticonHolder.replace(':HOLDER:', 'sad'),
'8-)' : fbEmoticonHolder.replace(':HOLDER:', 'geek'),
'8)' : fbEmoticonHolder.replace(':HOLDER:', 'geek'),
'B-)' : fbEmoticonHolder.replace(':HOLDER:', 'geek'),
'B)' : fbEmoticonHolder.replace(':HOLDER:', 'geek'),
':-P' : fbEmoticonHolder.replace(':HOLDER:', 'tongue'),
':P' : fbEmoticonHolder.replace(':HOLDER:', 'tongue'),
':-p' : fbEmoticonHolder.replace(':HOLDER:', 'tongue'),
':p' : fbEmoticonHolder.replace(':HOLDER:', 'tongue'),
'=P' : fbEmoticonHolder.replace(':HOLDER:', 'tongue'),
'=p' : fbEmoticonHolder.replace(':HOLDER:', 'tongue'),
'o.O' : fbEmoticonHolder.replace(':HOLDER:', 'speechless'),
'O.o' : fbEmoticonHolder.replace(':HOLDER:', 'speechless'),
':v' : fbEmoticonHolder.replace(':HOLDER:', 'pacman'),
'O:)' : fbEmoticonHolder.replace(':HOLDER:', 'angel'),
'O:-)' : fbEmoticonHolder.replace(':HOLDER:', 'angel'),
'<3' : fbEmoticonHolder.replace(':HOLDER:', 'heart'),
':\'(' : fbEmoticonHolder.replace(':HOLDER:', 'cry'),
':-D' : fbEmoticonHolder.replace(':HOLDER:', 'laugh'),
':D' : fbEmoticonHolder.replace(':HOLDER:', 'laugh'),
'=D' : fbEmoticonHolder.replace(':HOLDER:', 'laugh'),
'8-|' : fbEmoticonHolder.replace(':HOLDER:', 'cool'),
'8|' : fbEmoticonHolder.replace(':HOLDER:', 'cool'),
'B-|' : fbEmoticonHolder.replace(':HOLDER:', 'cool'),
'B|' : fbEmoticonHolder.replace(':HOLDER:', 'cool'),
';-)' : fbEmoticonHolder.replace(':HOLDER:', 'wink'),
';)' : fbEmoticonHolder.replace(':HOLDER:', 'wink'),
':-&' : fbEmoticonHolder.replace(':HOLDER:', 'sick'),
':&' : fbEmoticonHolder.replace(':HOLDER:', 'sick'),
':-O' : fbEmoticonHolder.replace(':HOLDER:', 'shock'),
':O' : fbEmoticonHolder.replace(':HOLDER:', 'shock'),
':-o' : fbEmoticonHolder.replace(':HOLDER:', 'shock'),
':o' : fbEmoticonHolder.replace(':HOLDER:', 'shock'),
'3:)' : fbEmoticonHolder.replace(':HOLDER:', 'devil'),
'3:-)' : fbEmoticonHolder.replace(':HOLDER:', 'devil'),
':-/' : fbEmoticonHolder.replace(':HOLDER:', 'mixed'),
':/' : fbEmoticonHolder.replace(':HOLDER:', 'mixed'),
':-\\' : fbEmoticonHolder.replace(':HOLDER:', 'mixed'),
':\\' : fbEmoticonHolder.replace(':HOLDER:', 'mixed'),
'[[f9.rainbow]]' : fbEmoticonHolder.replace(':HOLDER:', 'rainbow'),
'[[f9.cake]]' : fbEmoticonHolder.replace(':HOLDER:', 'cake'),
'[[f9.coffee]]' : fbEmoticonHolder.replace(':HOLDER:', 'coffee'),
'[[f9.gift]]' : fbEmoticonHolder.replace(':HOLDER:', 'gift'),
'[[f9.bomb]]' : fbEmoticonHolder.replace(':HOLDER:', 'bomb'),
'[[f9.clap]]' : fbEmoticonHolder.replace(':HOLDER:', 'clap'),
'[[f9.sleepy]]' : fbEmoticonHolder.replace(':HOLDER:', 'sleepy'),
'[[f9.stary]]' : fbEmoticonHolder.replace(':HOLDER:', 'stary'),
'[[f9.heartbreak]]' : fbEmoticonHolder.replace(':HOLDER:', 'heartbreak'),
'[[f9.inlove]]' : fbEmoticonHolder.replace(':HOLDER:', 'inlove')
};
var charsForReplacement = [
':\\)', ':-\\)', ':\\(', ':-\\(', '8-\\)', '8\\)', 'B-\\)', 'B\\)', ':-P', ':P', ':-p', ':p', '=P', '=p', 'o.O',
'O.o', ':v', 'O:\\)', 'O:-\\)', '<3', ':\'\\(', ':-D', ':D', '=D', '8-\\|', '8\\|', 'B-\\|', 'B\\|', ';-\\)',
';\\)', ':-&', ':&', ':-O', ':O', ':-o', ':o', '3:\\)', '3:-\\)', ':-/', ':/', ':-\\\\', ':\\\\',
'\\[\\[f9.rainbow\\]\\]', '\\[\\[f9.cake\\]\\]', '\\[\\[f9.coffee\\]\\]', '\\[\\[f9.gift\\]\\]',
'\\[\\[f9.bomb\\]\\]', '\\[\\[f9.clap\\]\\]', '\\[\\[f9.sleepy\\]\\]', '\\[\\[f9.stary\\]\\]',
'\\[\\[f9.heartbreak\\]\\]', '\\[\\[f9.inlove\\]\\]'
];
/*
FOR TESTING PURPOSES (paste it in the chat window)
:) :-) :( :-(
8-) 8) B-) B) :-P :P :-p :p =P =p o.O O.o :v O:)
O:-) <3 :'( :-D :D =D 8-| 8| B-| B| ;-) ;) :-& :& :-O :O :-o :o 3:) 3:-) :-/ :/ :-\ :\
[[f9.rainbow]] [[f9.cake]] [[f9.coffee]] [[f9.gift]] [[f9.bomb]] [[f9.clap]] [[f9.sleepy]] [[f9.stary]] [[f9.heartbreak]] [[f9.inlove]]
*/
// generate regex - START
var regexPattern = '\\B(';
for (var i in charsForReplacement) {
regexPattern += '(?:' + charsForReplacement[i] + ')';
if (i != charsForReplacement.length - 1) {
regexPattern += '|';
}
}
regexPattern += ')\\B(?!\\w)';
// generate regex - END
var regex = new RegExp(regexPattern, 'g');
return rawText.replace(regex, function(match) {
var replacement = $.trim(match);
return match.replace(replacement, replacementMap[replacement]);
});
};
我要做的是创建正则表达式以匹配所有表情符号。 数组charsForReplacement用于创建常规exp。因为表情符号有时会包含正则表达式中特殊字符的字符。
在匹配emoticn时使用replacementMap,然后使用需要替换的内容进行读取。生成的注册进出口。模式是:
\ B(?(::))|(::-))|(::()|(::-()|(8 - )????)|(?:8)) |(:乙 - ?))|(:B))|(:: - p)|(:: p)|(:: - p)|(:: p)|(:??????= p)|(?:= p)|(?:OO)|(:OO)|(:: v)|(?:?2 O :))|(:O型:-))|(?:?&LT (?:8- \ | |)|(?:8 \ |): - ; 3)| |(?::'()(?:: d)|(?:: d)|(= d) |(:B- \ |?)|:(:;-)?)| |(B \ |?)(:;?)?)|(:: - &安培;)|(::&安培;)| (:: - O 3)|(:: O 3)|(:: - O 3)|(:: O 2)|(?:3 :))|(?:3 :-))|(?: : - ?/)|(:: /)|(:: - \)|(:: \)|(:????[[f9.rainbow]])|(:[[f9.cake]]) |(:[[f9.coffee]])|(:[[f9.gift]])|(?:[[f9.bomb]])|(?:[[f9.clap]])|( ?:[[f9.sleepy]])|(?:[[f9.stary]])|(?:[[f9.heartbreak]])|(?:[[f9.inlove]]))\ B( ?!\ w)的
但它似乎很复杂,但事实并非如此。那是因为有很多表情可以匹配。
BUt,比方说,我们想要匹配一些表情符号,例如':)',':P','XD' 然后reg。进出口。模式看起来像:
\ B((::))|(:: P)|(:???XD))(?!\ w)的\乙
我需要你的帮助人员!
答案 0 :(得分:0)
你应该逃避你的表情符号。所以正则表达式:)是:\)。否则(::))是一个不平衡的正则表达式。
答案 1 :(得分:0)
我解决了我的问题。 改变正则表达式对我来说很好。如果javascript支持regex lookbehinds会更容易,但事实并非如此。
所以我做了一点解决方法。我会在较小的例子上展示解决方案,因为完整的例子太大了。
旧正则表达式如下:
\B((?::\))|(?::P)|(?:XD))\B(?!\w)
正则表达式应匹配:)或:P或XD前面至少有一个空格字符或字符串的开头,后面跟着至少一个空格字符或字符串结尾。
这些条件很重要,因为我不想匹配这样的东西:) :)或asdf :)或:)asdf
必须清楚表情符号。
我改变了我的正则表达式,最后我使用了正向前瞻而不是负向前瞻,删除了\ B作为我匹配字符串的边界,并添加了代码的和平,模拟了正则表达式开头时的正面观察。/ p>
(^|\W)((?::\))|(?::P)|(?:XD))(?=(\s|$))
现在一切都很好。这个修复程序将在早上正在生产http://starvibes.com,因此您可以尝试我们的Facebook聊天(在Facebook登录之后)并查看这个伟大的音乐网络播放器(以及更多)上的ifithing是否正常工作。