2016-09-17 4 views
1

Discordがサポートするマークダウンのサブセット(*_`~)をエスケープしようとしています。 既にエスケープされている文字には、バックスラッシュを追加しないでください。 これは私が持っているものです。マークダウンの部分集合をエスケープする

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

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

これは正常に動作し、マイナスお互いに対して複数の値下げ文字はすべてエスケープされていないという事実。私は表現をばかげて複雑にすることなく、これを可能にするためにこれをどのように拡張するのかはわかりません。

+2

文字はすでに、必ずしもそれはだという意味ではありませんので、その前にバックスラッシュを持っている場合エスケープされた、例えば'\\〜' – qxz

+0

@qxzあなたはまったく正しいです。 – Gawdl3y

答えて

1

私は、任意の既にエスケープ文字をアンエスケープ、もう一度すべてをエスケープすることをお勧め:

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));

+0

これは実際に私が自分自身と一緒に出てきたものに非常に近く、現在使用していますが、副作用がないわけではありません。マークダウン文字がエスケープされていない場合の既存のダブルエスケープの問題を解決しますが、文字列の既存のバックスラッシュも完全に削除します。文字列に\\がある生のバックスラッシュ(Windowsパスのような)が含まれていると仮定すると、結果から完全になくなります。 – Gawdl3y

+0

最初の正規表現を編集して、5つの特殊文字のみをエスケープします。 – qxz

関連する問題