【问题标题】:Markdown to convert double asterisks to bold text in javascriptMarkdown 将双星号转换为 javascript 中的粗体文本
【发布时间】:2012-04-27 10:31:01
【问题描述】:

我正在尝试像 Stackoverflow 一样制作我自己的可降价文本区域。目标是允许人们在 textarea 中输入 **blah blah**,并在 div 中输出 <span style="font-weight:bold;">blah blah</span>

我在使用 javascript 查找并用 HTML 替换**星号时遇到问题。

这是一个让派对开始的 jsfiddle:http://jsfiddle.net/trpeters1/2LAL4/14/

这里的 JS 只是为了告诉你我在哪里:

$(document.body).on('click', 'button', function() {

var val=$('textarea').val();

var bolded=val.replace(/\**[A-z][0-9]**/gi, '<span style="font-weight:bold;">"'+val+'" </span>');

$('div').html(bolded);
});

还有 HTML...

<textarea></textarea>
<div></div><button type="button">Markdownify</button>

任何想法将不胜感激!

谢谢, 时间

【问题讨论】:

标签: javascript jquery markdown wysiwym


【解决方案1】:

当字符紧接在星号之前或之后时,其他答案会失败。​​

这就像降价应该:

function bold(text){
    var bold = /\*\*(.*?)\*\*/gm;
    var html = text.replace(bold, '<strong>$1</strong>');            
    return html;
}
    
var result = bold('normal**bold**normal **b** n.');
document.getElementById("output").innerHTML = result;
div { color: #aaa; }
strong { color: #000; }
&lt;div id="output"&gt;&lt;/div&gt;

【讨论】:

  • 如果第一个匹配项后面跟着另一个只包含一个字母的匹配项jsfiddle.net/b5gvajsx/9,这将不起作用
  • 如果有人知道如何解决 LaurelB 提到的问题 ^,请发表评论。
  • 在单行中return text.replace(/\*\*(\S(.*?\S)?)\*\*/gm, '&lt;strong&gt;$1&lt;/strong&gt;')
  • 删除所有 \S 似乎已经解决了 LaurelB 的问题。更新了答案。
【解决方案2】:

所提供的答案都不适用于所有情况。例如,如果我们在双星旁边有一个空格,则其他解决方案将不起作用,即:

This will ** not ** be bold

所以我写了这个:

function markuptext(text,identifier,htmltag)
{
    var array = text.split(identifier);
    var previous = "";
    var previous_i;
    for (i = 0; i < array.length; i++) {
        if (i % 2)
        {
            //odd number
        }
        else if (i!=0)
        {
            previous_i = eval(i-1);
            array[previous_i] = "<"+htmltag+">"+previous+"</"+htmltag+">";
        }
        previous = array[i];
    }
    var newtext = "";
    for (i = 0; i < array.length; i++) {
        newtext += array[i];
    }
    return newtext;
}

只要这样称呼它:

thetext = markuptext(thetext,"**","strong");

它适用于所有情况。当然,您也可以根据需要将其与其他标识符/html-tags 一起使用 (stackoverflow 预览也应该有这个)。

【讨论】:

  • "testing regex in *javascript* when using different **stuff**"markuptext(thetext,"*","strong"); 返回 "testing regex in &lt;strong&gt;javascript&lt;/strong&gt; when using different &lt;strong&gt;&lt;/strong&gt;stuff&lt;strong&gt;&lt;/strong&gt;"
【解决方案3】:

为什么要从头开始创建?有这么多开源编辑器,你应该选择一个你喜欢的代码库并从那里开始。 http://oscargodson.github.com/EpicEditor/ http://markitup.jaysalvat.com/home/

【讨论】:

  • 嗨,汤姆,感谢您的这些建议,EpicEditor 非常好。但是,这些编辑对我的需求来说太过分了。我宁愿花时间学习如何编写我想要的简单功能(只是粗体、斜体、超链接文本),而不是尝试去卷积这些复杂的代码库。更无聊的原因是这个周末我已经花了 ALOT 的时间对各种浏览器中的 iframe 行为感到非常沮丧,并且大多数编辑器,包括你提到的那些都使用 iframe。所以我再也受不了了。
  • 啊,好的,蒂姆,这个怎么样:github.com/coreyti/showdown/blob/master/src/showdown.js 体面地解释了 RegEx。也适用于更简洁的代码,但 cmets 更少:github.com/chjj/marked/blob/master/lib/marked.js
  • 请与@tim 保持联系,了解最适合您的方法;我也想创建自己的 MarkDown 版本。我想创建对我有意义的代码:
    /italic/ bold underline -deleted- [Maybe url|www.url.com]
    .我希望你能帮我找个麻烦:)
  • 嗨,汤姆,由于大家的帮助,我现在实际上运行良好,看看这个演示:jsfiddle.net/trpeters1/2LAL4/49
  • 酷,在这里工作!不过有一件事:通常你想要en.wikipedia.org/wiki/Separation_of_presentation_and_content,所以我做了:jsfiddle.net/tomByrer/2LAL4/50(顺便说一句,MarkDown 使用 而不是 )我仍然想知道是否需要双 val.replace,但我不需要RegEx 非常好,所以我无法修复 ATM。
【解决方案4】:

react 中的自定义组件接收 boolean 之类的粗体

{(() => {
  const splitText = theText.split('**');
  return (
    <TextByScale>
      {splitText.map((text, i) => (
        <TextByScale bold={!!(i % 2)}>{text}</TextByScale>
      ))}
    </TextByScale>
  );
})()}

【讨论】:

    【解决方案5】:

    选择适合您需求的完美正则表达式。 如果您不希望样式跨越新行并且还使用([^*&lt;\n]+) 确保样式之间至少有一个字符,否则** 之间没有字符将导致不可见。

    function format_text(text){
    return text.replace(/(?:\*)([^*<\n]+)(?:\*)/g, "<strong>$1</strong>")
         .replace(/(?:_)([^_<\n]+)(?:_)/g, "<i>$1</i>")
          .replace(/(?:~)([^~<\n]+)(?:~)/g, "<s>$1</s>")
          .replace(/(?:```)([^```<\n]+)(?:```)/g, "<tt>$1</tt>")
    }
    

    •上述代码的缺点是,您不能嵌套样式,即 *_Bold and italic_*

    要允许嵌套样式使用这个?

    format_text(text){
    return text.replace(/(?:\*)(?:(?!\s))((?:(?!\*|\n).)+)(?:\*)/g,'<b>$1</b>')
       .replace(/(?:_)(?:(?!\s))((?:(?!\n|_).)+)(?:_)/g,'<i>$1</i>')
       .replace(/(?:~)(?:(?!\s))((?:(?!\n|~).)+)(?:~)/g,'<s>$1</s>')
       .replace(/(?:--)(?:(?!\s))((?:(?!\n|--).)+)(?:--)/g,'<u>$1</u>')
       .replace(/(?:```)(?:(?!\s))((?:(?!\n|```).)+)(?:```)/g,'<tt>$1</tt>');
    
    // extra:
    // --For underlined text--
    // ```Monospace font```
    }
    

    ? 如果您希望您的样式跨越新行,请从正则表达式中删除 \n。此外,如果您的新行是 html 中断标记,您可以将 \n 替换为 &lt;br&gt;

    稍后谢谢!

    【讨论】:

      【解决方案6】:

      如果您使用的是 jQuery,请替换:

      $(document.body).on('click', 'button', function() {
      

      用这个:

      $("button").click(function () {
      

      【讨论】:

      • 嗨 Gustavo,感谢您的输入,是的,我正在使用 jQuery,on 方法是一个 jQuery 方法,从 1.7 api.jquery.com/on 开始,在这种情况下将事件处理程序附加到选择器是文档。身体。它对于动态创建的元素(例如本例中的按钮)特别有用,例如通过 AJAX。
      • 这并不能真正回答问题,是吗?
      • 对不起,它并没有真正回答这个问题。我也错过了准备好的文档...看起来您的正则表达式已损坏,如下面的答案,但其下方的正则表达式也已损坏。
      【解决方案7】:

      以下正则表达式将找到您的星号环绕的文本:

      /\x2a\x2a[A-z0-9]+\x2a\x2a/

      我更新了你的小提琴作为例子:http://jsfiddle.net/2LAL4/30/

      【讨论】:

        【解决方案8】:

        一方面,您的正则表达式已损坏。你可能想要更多类似的东西:

        /\*\*[A-z0-9]+\*\*/gi
        

        * 是正则表达式中的特殊字符。如果要匹配文字 *,则需要使用 \ 对其进行转义。

        例如:http://jsfiddle.net/2LAL4/22/

        但是,即使进行了这种更改,在您到达您真正想去的地方之前,还有很长的路要走。例如,如果文本区域包含粗体和非粗体文本,则您的示例将不起作用。

        【讨论】:

        • 嗨,aroth,谢谢,是的,我知道还有一条路要走。看起来我需要先找到星号包装的文本,这样我就不会选择整个textarea.val()。在我不再纠缠你提供线索之前,你介意吗?
        • 如果您需要一个允许使用粗体字的空格:jsfiddle.net/2LAL4/172
        • ds**d**d 变为 ds&lt;b&gt;dsdd&lt;/b&gt;d,这是错误的。 :(
        猜你喜欢
        • 2020-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-27
        • 2021-11-28
        相关资源
        最近更新 更多