【问题标题】:javascript match replace textjavascript匹配替换文本
【发布时间】:2012-05-01 06:29:08
【问题描述】:

快速提问,我想将一些 Markdown HTML 内容从双星号转换为粗体。

我得到的错误是:`Uncaught TypeError: Cannot call method 'replace' of null '

这是 jsfiddle:http://jsfiddle.net/fz5ZT/9/

这是 HTML:

<div class="comments">comment 1** is good**</div>
<div class="comments">comment 2**is bad**</div>

这是 JS:

function markdown(markdownable){

  var boldMatch = markdownable.match(/\*\*[A-Za-z0-9]+\*\*/gim), 
  boldReplace = boldMatch.replace(/\*\*[A-z0-9]+\*\*/gim, '<span style="font-  weight:bold;color:blue;">'+boldMatch+'</span>'),                   
  markdownable = markdownable.replace(boldMatch, boldReplace),    
  markdownable = markdownable.replace(/\*\*/gi, "");

  return markdownable;
}

$('.comments').each(function(){  
   var markdownable=$(this).html(), comments=markdown(markdownable);
});

如果您能提供帮助,我将不胜感激,

谢谢, 时间

更新谢谢大家!请参阅此以获得工作演示:http://jsfiddle.net/fz5ZT/30/

【问题讨论】:

  • 如果粗体 rexep 不匹配,“boldMatch”将为空。 “null”没有(原型)属性“replace”可以调用 - 抛出错误。
  • 感谢Bergi,但是如果我将变量mardownable 包含在双星号文本中,为什么“boldMatch”为空?不应该匹配吗?
  • 不,markdownable 中有一个空格与您的正则表达式都不匹配。

标签: javascript jquery function replace match


【解决方案1】:
markdownable = markdownable.replace( /\*\*(.+?)\*\*/gm, '<strong>$1</strong>' );

但是,与其进行半心半意、善意、注定要失败的重新发明轮子的尝试,为什么不只是use an existing JavaScript Markdown library

编辑:这是一个更健壮的正则表达式(如 Markdown)要求在“打开”之后或“关闭”之前没有空格:

var bold = /\*\*(\S(.*?\S)?)\*\*/gm;
markdownable = markdownable.replace( bold, '<strong>$1</strong>' );

【讨论】:

  • 参见developer.mozilla.org/en/JavaScript/Guide/… — 它指的是在1st 组括号内找到并捕获的文本(从左边数到看到左括号的位置) .
  • 谢谢,太好了,我以前见过,但不知道这是什么意思!
  • 嗨 Phrogz,我意识到这有助于正则表达式部分,但仍然没有回答为什么 replace 方法为空。有 2 个包含星号的 cmets,replace 方法不应该有 2 个要替换的字符串吗?
  • 我不知道您所说的“为什么替换方法为空”是什么意思。还有很多其他好的 cmets 和答案告诉你为什么你以前的代码被破坏了。阅读它们以更深入地了解您的旧代码。我上面的单行取代了所有废话,你的函数的所有四行。
  • 大家好,请查看此 jsfiddle 以获取工作演示:jsfiddle.net/fz5ZT/30
【解决方案2】:

您的第一个正则表达式匹配忽略了字符串中的空格。您需要在允许的字符集[ a-z0-9] 中添加一个空格;由于i,您不需要A-Z

另外,match 返回一个数组,因此您需要获取第一个匹配项 boldMatch[0] 才能访问返回的字符串。

【讨论】:

  • 另外,你需要检查一下 boldMatch 是否找到了一些东西。因为如果不是,它是 null (而不是空字符串) - 这就是你得到错误的原因。
  • 你好 yoavmatchulsky,但 boldMatch 不应该找到什么吗?有 2 个带星号的 cmets。
【解决方案3】:

也许你可以看看下面的解决方案:

Find text string using jQuery?

我相信你需要做一些非常相似的事情:

  $('*:contains("I am a simple string")').each(function(){
 if($(this).children().length < 1) 
      $(this).html( 
           $(this).text().replace(
                /"I am a simple string"/
                ,'<span containsStringImLookingFor="true">"I am a simple string"   </span>' 
           )  
       ) 
});

要使元素变为粗体,您需要在替换发生后使用 addClass()。

谢谢

【讨论】:

    【解决方案4】:
    function markdown(markdownable) {
    
        var boldMatch = markdownable.match(/[\*]{2}( .+)?[\*]{2}/gim);
        if (boldMatch && (boldMatch = boldMatch[0])) {
            var boldReplace = boldMatch.replace(/[\*]{2}( .+)+?[\*]{2}/gim, '<span style="font-weight:bold;color:blue;">' + boldMatch + '</span>');
            markdownable = markdownable.replace(boldMatch, boldReplace);
            markdownable = markdownable.replace(/\*\*/gi, "");
        }
        return markdownable;
    }
    
    $('.comments').each(function() {
    
        var markdownable = $(this).html(),
            comments = markdown(markdownable);
    
        console.log(comments);
    });​
    

    到目前为止,这不是最好的解决方案……但它是您尝试的“修复”。希望您能了解您出错的地方。

    【讨论】:

    • 请注意,没有理由在正则表达式中使用[\*] 而不仅仅是\*。为什么在内容的开头需要一个空格?
    • 因为这似乎是比赛的要求。 **bad** good
    • 哦;我个人怀疑这是什么意思,因为这不在原始的正则表达式中,并且与 Markdown 要求的相反。我认为“好”和“坏”只是 cmets 的迹象。但也许你是对的。
    • 至于[],我通常将它们放在适当的位置以提高可读性...但是是的,您是对的,这是个人的事情。
    • 是的..正如您将看到的** this仅适用于特定情况。
    【解决方案5】:

    在您知道其中有一个值可以使用之前,您不想在 boldMatch 上调用 .replace(),也就是说,如果没有匹配项。

    更安全的计算:

    var boldMatch = markdownable.match(/\*\*[A-Za-z0-9]+\*\*/gim);
    if (boldMatch) { 
      var boldReplace = boldMatch.replace(/\*\*[A-z0-9]+\*\*/gim, '<span style="font- weight:bold;color:blue;">'+boldMatch+'</span>');
    }
    

    等等

    更新:

    这行代码也让人很难追踪到底发生了什么:

    var markdownable=$(this).html(), comments=markdown(markdownable);
    

    使用 var 在一行上声明两个变量通常是不受欢迎的。更好:

    var markdownable=$(this).html();
    if (markdownable) {
        comments=markdown(markdownable);
    }
    

    【讨论】:

    • 嗨,David,感谢您的回复,但 boldMatch 不应该找到什么吗?有 2 个带星号的 cmets。
    • 正如Bergi 提到的,您的第一个测试用例将不匹配。试试这个作为测试用例,你可能会看到发生了什么:

      【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2018-02-01
    相关资源
    最近更新 更多