javascript匹配替换文本

时间:2012-04-19 17:10:17

标签: javascript jquery function replace match

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

我得到的错误是:`未捕获TypeError:无法调用方法'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/

5 个答案:

答案 0 :(得分:5)

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>' );

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

你不想在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);
}

答案 3 :(得分:1)

您可以查看以下解决方案:

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 :(得分:1)

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);
});​

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