Ответ 1
Некоторые реализации Markdown – в частности, версия С# на стороне сервера стека Overflow MarkdownSharp (где необязательный поведение) и клиентской версии JavaScript PageDown, но также, например, вкус GitHub – отклонились от спецификации Markdown по той самой причине, которую вы описали.
Для некоторой истории об этом, поскольку Qaru идет, см. два сообщения в блоге Three Markdown Gotchas и Markdown, Через год.
Поскольку это общепринятая критика Markdown, вероятно, есть больше реализаций, которые либо делают это поведение настраиваемым пользователем, либо просто переходят с более строгой версией. Это зависит от того, какую реализацию вы используете.
Если вы используете порт, основанный на оригинальной реализации Perl от John Gruber (т.е. версии "тонн замены регулярных выражений" ), это должно быть довольно легко сделать самим образом. Соответствующая функция, скорее всего, называется _DoItalicsAndBold
(оригинальная версия Perl, Showdown/PageDown), DoItalicsAndBold
(MarkdownSharp), _do_italics_and_bold
(python-markdown2) или аналогичная.
Посмотрите на нашу PageDown версию этой функции для более строгих регулярных выражений, которые используются здесь в Stack Overflow:
function _DoItalicsAndBold(text) {
// <strong> must go first:
text = text.replace(/([\W_]|^)(\*\*|__)(?=\S)([^\r]*?\S[\*_]*)\2([\W_]|$)/g,
"$1<strong>$3</strong>$4");
text = text.replace(/([\W_]|^)(\*|_)(?=\S)([^\r\*_]*?\S)\2([\W_]|$)/g,
"$1<em>$3</em>$4");
return text;
}