我正在为一个游戏项目开发一个聊天客户端,并且正在实施表情符号。表情符号在聊天中显示位置的基本规则是,表情符号直接位于文本旁边时不显示。

我创建了正则表达式:\ B(emoticontext)\ B。

不幸的是,我遇到一个问题,即除了包含字母的表情符号外,其他表情符号都可以很好地工作。 (例如:D,O_o等)

我不确定如何纠正这种情况。

function parseEmoticons(text) {
    var pattern;
    emoticons.forEach(function (emoticon) {
        pattern = new RegExp("\\B" + emoticon.string + "\\B", 'g');
        text = text.replace(pattern, emoticon.img);
    });
    return text;
}


对于上下文,这是表情符号数组的一部分。

  { 'string': ':\\)', 'img': '<img src="' + imgpath + 'emoticons/smile.png" class="emoticon"/>' },
    { 'string': ':O', 'img': '<img src="' + imgpath + 'emoticons/surprised.png" class="emoticon"/>' },
    { 'string': ':D', 'img': '<img src="' + imgpath + 'emoticons/happy.png" class="emoticon"/>' },

最佳答案

当它们直接位于文本旁边时不显示


听起来更像是您要检查周围的空格,而不是\B(“非单词边界”)。

那是:

var pattern = new RegExp('(^|\\s)' + emoticon.string.replace(/\W/g, '\\$&') + '(?!\\S)', 'g');
text = text.replace(pattern, function (m0, m1) { return m1 + emoticon.img; });


注意事项:


(^|\s)检查(并捕获)字符串或空白字符的开头
.replace(/\W/g, '\\$&')转义表情符号中所有潜在的正则表达式元字符(这意味着您可能必须在表情符号列表中将':\\)'更改为':)'
(?!\S)(“不后跟非空格字符”)可确保表情符后跟空格或字符串结尾(我们一开始不能使用相同的技巧,因为JavaScript不支持外观-背后)
由于我们可能在一开始就捕获了空格字符,因此我们必须将其替换为HTML代码
我们可以使用.replace(pattern, '$1' + emoticon.img)来做到这一点,但是如果emoticon.img最终包含$可以理解和解释的一种特殊.replace模式之一,则会导致问题
相反,我们使用了替换函数,该函数将整个匹配的字符串和捕获组(以及其他一些东西)作为参数(但是我们只关心第一个捕获组)

关于javascript - 用\B实现RegExp与不匹配包含字母的图释的图释,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37901549/

10-11 03:06