我正试图逃避Discord支持的降价子集(*
,_
,`
,~
)。
已转义的字符不应添加其他反斜杠。
这就是我所拥有的:
function escapeMarkdown(text) {
return text.replace(/([^\\]|^|\*|_|`|~)(\*|_|`|~)/g, '$1\\$2');
}
console.log(escapeMarkdown('*test* _string_ ~please~ `ignore` *_`~kthx \* \\~'));
这样可以正常工作,减去相互之间的多个降价字符不会全部转义的事实。我不知道如何扩大这一点以实现这一目标,而不会使表达变得荒谬复杂。
答案 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||'));
如果有两个字符,它将在正则表达式中的任何字符之前添加反斜杠。