【问题标题】:What is the best way to convert **title** to <h1>title</h1> in large text in one string traversal? [duplicate]在一个字符串遍历中将大文本中的 **title** 转换为 <h1>title</h1> 的最佳方法是什么? [复制]
【发布时间】:2015-01-01 09:31:12
【问题描述】:

假设有一大段文字,转换规则为:

  • **title**&lt;h1&gt;title&lt;/h1&gt;

  • :blush:&lt;img class="emoji" title="blush" src="/img/blush.png"/&gt;

如何在一次遍历中进行转换?

【问题讨论】:

  • 你试过了吗?
  • @DavidThomas 是的,感谢您的更正。
  • @sp00m 我试图查看marked.js,但它太复杂了,我无法理解...
  • 这是一个好问题,并行执行字符串或正则表达式替换与按顺序执行它们不同(想想.replace('+', '-').replace('-', '+')。我还没有在 SO 上找到一个很好回答的重复项
  • 好的,找到了一个:stackoverflow.com/questions/15604140/… 它使用了这样一个事实,即您可以将函数作为第二个参数提供给.replace

标签: javascript regex


【解决方案1】:

使用不同的捕获组在 1 个正则表达式中捕获不同的模式,并使用替换功能检查不同的捕获组:

var input = '**Hey** Oh you! :blush:';
document.write(input.replace(/\*\*([^*]*)\*\*|:(happy|blush):/ig, function(match, title, smiley) {
  if (title != undefined) {
    return '<h2>' + title + '</h2>';
  } else if (smiley != undefined) {
    return '<img class="emoji" title="blush" src="/img/' + smiley + '.png" />';
  }
}));

这是此页面上仅有一次遍历的唯一答案。请注意,它不会捕捉到这个:

var text = '**title with :blush: smiley** gotcha!';

【讨论】:

    【解决方案2】:

    标题

    var re_title = /\*\*(.+)\*\*/g;
    str.replace(re_title, '<h1>$1</h1>')
    

    表情符号

    var re_emoji = /:(.+):/g;
    str.replace(re_emoji, '<img class="emoji" title="$1" src="/img/$1.png"/>')
    

    您可以通过一个接一个地进行替换来将它们组合在一起。

    str.replace(re_title, '<h1>$1</h1>').replace(re_emoji, '<img class="emoji" title="$1" src="/img/$1.png"/>')
    

    样本

    var str = '**title** :some_emoji:'
    str.replace(re_title, '<h1>$1</h1>').replace(re_emoji, '<img class="emoji" title="$1" src="/img/$1.png"/>')
    // output = "<h1>title</h1> <img class="emoji" title="some_emoji" src="/img/some_emoji.png"/>"
    
    var str = '**:some_emoji: **'
    str.replace(re_title, '<h1>$1</h1>').replace(re_emoji, '<img class="emoji" title="$1" src="/img/$1.png"/>')
    // output = "<h1><img class="emoji" title="some_emoji" src="/img/some_emoji.png"/></h1>"
    

    由于无法命名捕获组,因此无法使用“a|b”正则表达式语法进行替换。

    【讨论】:

      【解决方案3】:

      你可以试试这个:

      <div id="replace">**title**some text :blush: some link </div>
      var str= $("#replace").html();    
      str = str.replace("**title**", "<h1>title</h1>");     
      str = str.replace(":blush:", "<img class="emoji" title="blush" src:"/img/blush.png"/>");     
      $("#replace").html(str);    
      

      【讨论】:

      • 谢谢!这对我来说当然是一个好的开始!
      【解决方案4】:

      您可以使用正则表达式来解决这个问题。

      var mystring = 'some text **title** some other text';
      var re = /\*{2}(\w*)\*{2}/g;
      mystring.replace(re, "<h1>$1</h1>");
      

      这里正则表达式搜索任何以两个 * 开头并以两个 * 结尾的模式。中间部分被捕获并在replace方法中使用。

      【讨论】:

        【解决方案5】:

        执行此类操作的最佳方法是regex - 它是针对每种语言的此类任务的非常优化的机制。

        根据您的示例在 javascript 中:

        >>> "**title** qweqwe **foo** ololo **bar**".replace(/(\*\*(\w+)\*\*)/g, "<h1>$2</h1>")
        "<h1>title</h1> qweqwe <h1>foo</h1> ololo <h1>bar</h1>"
        

        ":blush: qweqwe :tongue: ololo :smile:".replace(/(\:(\w+)\:)/g, '<img class="emoji" title="$2" src:="/img/$2.png"/>')
        "<img class="emoji" title="blush" src:="/img/blush.png"/> qweqwe <img class="emoji" title="tongue" src:="/img/tongue.png"/> ololo <img class="emoji" title="smile" src:="/img/smile.png"/>"
        

        多多!

        【讨论】:

        • 这是两个遍历,一个用于标题,一个用于表情符号。
        • 嗯,在 js 正则表达式中有 x|y 语法,但没有命名组语法......所以我们无法区分哪个在哪里。或者你可以使用这个跨浏览器 js 库来扩展正则表达式语法 - xregexp.com/syntax/#namedCapture 但我建议你不要这样做,只使用一个普通的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-01
        • 2016-04-20
        • 2012-03-04
        • 2010-09-17
        • 1970-01-01
        相关资源
        最近更新 更多