我正在为一个游戏项目开发一个聊天客户端,并且正在实施表情符号。表情符号在聊天中显示位置的基本规则是,表情符号直接位于文本旁边时不显示。
我创建了正则表达式:\ 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/