Экранированный персонаж в Telegram Bot API 4.5 MarkdownV2 создает проблемы для гиперссылки - PullRequest
0 голосов
/ 08 февраля 2020

Telegram Bot API 4.5 поставляется с новым режимом анализа, MarkdownV2. В то же время эти _ * [ ] ( ) ~ > # + - = | { } . ! символы должны быть экранированы с предыдущим символом \.

.replace(/[-.+?^$[\](){}\\]/g, '\\$&') используется в качестве решения для добавления управляющего символа, который работает очень хорошо, но, к сожалению, это решение влияет на метод гиперссылки [inline URL](http://www.example.com/), поскольку он заменяет \[inline URL\]\(http://www.example\.com/\)

Решение

bot.on('text', (ctx) => {
  const { chat } = ctx.message;
  const msgs = `Here is the [rules](https://telegra.ph/rules-05-06) Please read carefully and give the details which mentioned below.
*Name:*
*Place:*
*Education:*
*Experience:*
You can also call me on (01234567890)
__For premium service please contact with admin__`;

  const msgmsgWithEscape = msgs.replace(/[-.+?^$[\](){}\\]/g, '\\$&')

  ctx.telegram.sendMessage(
    chat.id,
    msgmsgWithEscape,
    {
      parse_mode: 'MarkdownV2',
    }
  )
});

Результат

enter image description here

1 Ответ

0 голосов
/ 10 февраля 2020

Чтобы избежать экранирования ссылок, отформатированных как [...](http...), вы можете сопоставить их и захватить в группу и просто сопоставить все символы, чтобы скрыться в других контекстах. Затем проверьте значение группы 1 и, если оно не пустое, замените его значением группы 1, в противном случае замените экранированным символом:

const msgs = `Here is the [rules](https://telegra.ph/rules-05-06) Please read carefully and give the details which mentioned below.
*Name:*
*Place:*
*Education:*
*Experience:*
You can also call me on (01234567890)
__For premium service please contact with admin__`;

const msgmsgWithEscape = msgs.replace(/(\[[^\][]*]\(http[^()]*\))|[-.+?^$[\](){}\\]/gi,
    (x,y) => y ? y : '\\' + x)

console.log(msgmsgWithEscape);
...