转义标记的Discord子集

时间:2016-09-17 04:31:47

标签: javascript regex markdown

我正试图逃避Discord支持的降价子集(*_`~)。 已转义的字符不应添加其他反斜杠。 这就是我所拥有的:

function escapeMarkdown(text) {
	return text.replace(/([^\\]|^|\*|_|`|~)(\*|_|`|~)/g, '$1\\$2');
}

console.log(escapeMarkdown('*test* _string_ ~please~ `ignore` *_`~kthx \*  \\~'));

这样可以正常工作,减去相互之间的多个降价字符不会全部转义的事实。我不知道如何扩大这一点以实现这一目标,而不会使表达变得荒谬复杂。

3 个答案:

答案 0 :(得分:2)

我建议不要使用任何已经转义的字符,然后再转发所有内容:



function escapeMarkdown(text) {
  var unescaped = text.replace(/\\(\*|_|`|~|\\)/g, '$1'); // unescape any "backslashed" character
  var escaped = unescaped.replace(/(\*|_|`|~|\\)/g, '\\$1'); // escape *, _, `, ~, \
  return escaped;
}

var str = '*test* _string_ ~please~ `ignore` *_`~kthx \*  \\~ C:\\path\\to\\file';
console.log("Original:");
console.log(str);
console.log("Escaped:");
console.log(escapeMarkdown(str));




答案 1 :(得分:0)

我知道这是使用ruby而不是js编写的,但是可以将其转换为JS,它转义了所有已知的不和谐特殊字符(+阻止了带有链接的预览)

  def escape(str)
    # \ -> \\
    str = str.gsub("\\") { "\\\\" }
    # - -> \_
    str = str.gsub('_') { "\\_" }
    # * -> \*
    str = str.gsub('*') { "\\*" }
    # ~ -> \~
    str = str.gsub('~') { "\\~" }
    # ` -> \`
    str = str.gsub('`') { '\\`' }
    # | -> \|
    str = str.gsub('|') { '\\|' }
    # urls without previews
    str = str.gsub(/https?:\/\/[\S]+/) { |url| "<#{url}>" }

    str
  end

(我将其发布在这里,因为我确信它可以帮助将来的读者,这似乎是谈论此问题的唯一场所)

这是一个充满Discord格式的字符串,作为奖励:

Italics *italics* or _italics_
Underline italics __*underline italics*__
Bold **bold**
Underline bold __**underline bold**__
Bold Italic ***bold italics***
underline bold italics __***underline bold italics***__
Underline __underline__
Strikethrough  ~~Strikethrough~~
Link https://google.com https://mathiasbynens.be/demo/url-regex
Code: `inline`

```
block
```

```ruby
block with language
```

Spoiler: ||spoiler||

答案 2 :(得分:0)

最近我不得不为NodeJS discord bot进行markdown转义功能,这是我使用的代码。

var markdownEscape = function(text) {
   return text.replace(/((\_|\*|\~|\`|\|){2})/g, '\\$1');
};

console.log(markdownEscape('||some spoiler text||'));

如果有两个字符,它将在正则表达式中的任何字符之前添加反斜杠。