JavaScript RegExp不针对所有字符串实例

时间:2014-06-26 23:08:31

标签: javascript jquery html regex

我的正则表达式不会返回textarea中找到的<li>.+<\/li>的所有实例。

我用Google搜索,并尝试/g,但无效。

以下是Fiddle

这是我的function(){...}

function doIt() {

    var input = document.getElementById("input");
    var olPatt = /<ol>\s*(?:<li>.+<\/li>\s*)+<\/ol>/,
        ol = input.value.match(olPatt),
        olLi = ol.toString().match(/<li>/g), // MATCH ALL <li> with /g
        olLiB = ol.toString().match(/<\/li>/g); // MATCH ALL </li> with /g
    var i = 1; // start with 1

    input.value = input.value.replace(/<ol>/, "").replace(/<\/ol>/, "").replace(/\s*/, ""); // remove ol tags

    input.value = input.value.replace(olLi, function() {return i++ + "." + " ";}).replace(olLiB, " ");
    // should replace ALL <li> found in <ol> with number starting with 1 </li>        

}

如果你得到了这个:

<ol>
<li>Hello world! :)</li> 
<li>Hello how are you</li> 
<li>good</li>
</ol>

它返回:(不正确)

1. Hello world! :)  
<li>Hello how are you</li> 
<li>good</li>

但是,我想要这个:(正确)

1. Hello world! :)  
2. Hello how are you
3. good

2 个答案:

答案 0 :(得分:1)

http://jsfiddle.net/3jthN/10/

您需要在进行实际替换的位置添加全局修改器。

在这种情况下,它在这一行:

input.value = input.value.replace(olLi, function() {return i++ + "." + " ";}).replace(olLiB, " ");

因为您要从变量中指定正则表达式模式,所以需要使用RegExp构造函数并将global修饰符作为第二个参数传递。小提琴演示了这一点。

new RegExp(olLi, 'g')

答案 1 :(得分:1)

下面:

input.value = input.value.replace(olLi, function () {
    return i++ + "." + " ";
}).replace(olLiB, " ");

olLiolLiB已经在ol.toString()上匹配。只需将它们保留为正则表达式,或者在另一个回调中执行替换(这似乎是最正确的):

input.value = input.value.replace(/<ol>\s*((?:<li>.+<\/li>\s*)+)<\/ol>/g,
    function (list, listItems) {
        return listItems.replace(/<li>/g, function () {
            return i++ + '. ';
        }).replace(/<\/li>/g, '');
    });

Updated jsFiddle