我的正则表达式不会返回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
答案 0 :(得分:1)
您需要在进行实际替换的位置添加全局修改器。
在这种情况下,它在这一行:
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, " ");
olLi
和olLiB
已经在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, '');
});