正则表达式没有按预期工作

时间:2011-08-09 12:22:43

标签: jquery regex

写了一些代码来帮助Find special markers in sequence and do something to the text in between

这是小提琴:http://jsfiddle.net/mplungjan/GyPHH/

为什么每个正则表达式只运行一次,你将如何处理嵌套的条目

<div id="texts">
**this** **would** make it **bold**  __this would__ make it __underlined__

__**how about bold and underlined**__

and

**__the other way around__**
</div>
var res = {
    boldIt:/\*\*(.*?)\*\*/g,
    underlineIt:/\_\_(.*?)\_\_/g
}
$.each(res, function(type, re) {
  var s = $("#texts").html();    
  var m = re.exec(s);
  var found = m[0];
  $.each(m, function(index, value) {    
    if (index==0) return true;
    var html = s.replace(found,'<span class="'+type+'" >'+value+'</span>',"g");
    $("#texts").html(html);
  });
});

2 个答案:

答案 0 :(得分:3)

该代码不必要地复杂化。试试这个:

var res = {
    boldIt:/\*\*(.*?)\*\*/g,
    underlineIt:/\_\_(.*?)\_\_/g
}

$.each(res, function(type, re) {
    var txt = $( "#texts" ).html();
    $( "#texts" ).html( txt.replace( re, '<span class="'+type+'" >$1</span>' ) );
});

答案 1 :(得分:2)

那是因为你正在替换一遍又一遍找到的第一个值。如果你检查结果,你会发现你已经用多个标签包装了第一个匹配。

您正在进行双循环,首先找到匹配项,然后替换每个匹配项。你可以马上替换它们。此外,当你可以只执行一次时,你将获得html并将其放回每次迭代:

var res = {
    boldIt:/\*\*(.*?)\*\*/g,
    underlineIt:/\_\_(.*?)\_\_/g
}
var s = $("#texts").html();    
$.each(res, function(type, re) {
  s = s.replace(re,'<span class="'+type+'" >$1</span>');
});
$("#texts").html(s);