将字符串转换为表情符号

3
我有一个功能,可以用给定的表情符号替换字符串代码的函数。
export const CHARS = {
  ":)": "",
  "(:": "",
  ":-)": "",
  ":(": "",
  "):": "",
  ":-(": "",
  ":/": "",
}

convertEmoji = string => {
    const escape = s => s.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&")
    const pattern = new RegExp(
      Object.keys(CHARS).map(escape).join("|"),
      "g"
    )
    return string.replace(pattern, match => CHARS[match])
}

这个函数的功能如预期一样,但是它也会在单词中存在任何给定的CHARS[key]时进行转换。
例如,将这个函数传递给包含URL的字符串:
https://google.com

Becomes:

https/google.com

我希望replace函数只在给定句子中以单词形式呈现的表情符号代码时起作用。例如:

:) 你好,世界! - 此处函数应该有效。

:)你好,世界! - 此处函数不应该起作用,因为表情符号代码没有正确的空格。

请帮助我解决这个问题。


1
为什么你会首先将 https://google.com 传递给 convertEmoji 函数呢? - h0r53
1
你可以添加负向先行断言来防止匹配,如果它前面或后面有特定字符。 - Barmar
2
@h0r53 可能是用户聊天输入,他们可能会键入一个URL。 - Barmar
2个回答

1
你需要为模式指定左右上下文。
如果你想确保左右两边没有单词字符,你需要使用明确的单词边界,并且使用 (?<!\w)(?!\w) 前后查找来表达这个概念。
new RegExp('(?<!\\w)(?:' + Object.keys(CHARS).map(escape).join("|") + ')(?!\\w)', "g")

或者,您可以依赖于空格边界,这需要两端都有空格字符或字符串的开头/结尾:

new RegExp('(?<!\\S)(?:' + Object.keys(CHARS).map(escape).join("|") + ')(?!\\S)', "g") 

根据您的需求选择解决方案,并在需要进一步精确边界模式时指定环视中的模式。


感谢您的详细解释。 - Body

0
如果有空间要求,你可以将该要求添加到CHARS中。

const CHARS = {
  ":) ": " ",
  "(:": "",
  ":-)": "",
  ":(": "",
  "):": "",
  ":-(": "",
  ":/": "",
}

convertEmoji = string => {
    const escape = s => s.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&")
    const pattern = new RegExp(
      Object.keys(CHARS).map(escape).join("|"),
      "g"
    )
    return string.replace(pattern, match => CHARS[match])
}

console.log(convertEmoji(":) Hello world!"))
console.log(convertEmoji(":)Hello world!"))


谢谢你的回答。我不能在对象键中使用任何空格,因为此功能会在按下空格键时触发。因此,在对象键中有空格字符将需要按两次空格键才能用表情符号替换代码。 - Body

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接