2009-08-11 66 views
2

我有以下的JavaScript(在<P> S中的空間是不換行):如何通過正則表達式的匹配在JavaScript中進行替換?

var html = '...<li>sub 2</li></ol></li></ol>\n\ 
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; subsub 1</p>\n\ 
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ii.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; subsub 2</p>\n\ 
<ol start="2"> \n\ 
<ol start="3"> \n\ 
<li>sub 3</li></ol>...'; 

$(function() { 
    var nestedListFixer = /(?:<\/li><\/ol>\s*)+(?:<p>(?:&(?:nbsp|\#0*160|x0*A0);)+(?:\s[ivxlcdm]+\.)(?:&(?:nbsp|\#0*160|x0*A0);)+\s(.*?)<\/p>\s*)+(?:<ol(?:\sstyle=\"[^\"]+\")?\sstart=\"[^\"]+\">\s*)+/i; 
    html = html.replace(nestedListFixer, function($0, $1){ 
     var lis = "" 
     $.each($1, function() { 
      lis += "<li>" + this + "</li>\n"; 
     }); 
     alert("<ol>\n" + lis + "</ol></li>"); 
     return "<ol>\n" + lis + "</ol></li>"; 
    }); 
}); 

alert()的輸出:

<ol> 
<li>s</li> 
<li>u</li> 
<li>b</li> 
<li>s</li> 
<li>u</li> 
<li>b</li> 
<li> </li> 
<li>2</li> 
</ol></li> 

這裏就是我希望這將是:

<ol> 
<li>subsub 1</li> 
<li>subsub 2</li> 
</ol></li> 

我如何正確遍歷的$1每場比賽?

更新:簡化模式和匹配例如:

var text = '1ab2cb3cd4ab5cb6cd7'; 

$(function() { 
    var textFixer = /(?:a)(?:b(.*?)c)+(?:d)/i; 
    text = text.replace(textFixer, function($0, $1){ 
     var numbers = ""; 
     $.each($1, function() { 
      numbers += this; 
     }); 
     alert(numbers); 
     return numbers; 
    }); 
    alert(text); 
}); 

// actual text: 
// 13467 
// desired text: 
// 1234567 
+0

你能不能簡化代碼,正則表達式和標記,使人們可以更容易地理解你的問題,所以幫你嗎? (不是一個修辭問題) – 2009-08-11 18:07:09

+0

我已經添加了一個更簡單的版本,這是否更有意義? – travis 2009-08-11 18:44:19

+0

等一下,「你不能......」你是說我已經簡化了太多嗎? – travis 2009-08-11 18:46:00

回答

1

下面是我想出了一個解決方案,但它似乎並不十分有效:

$(function() { 
    var nestedListFixer = /(?:<\/li><\/ol>\s*)+(?:<p>(?:&(?:nbsp|\#0*160|x0*A0);)+(?:\s[ivxlcdm]+\.)(?:&(?:nbsp|\#0*160|x0*A0);)+\s(.*?)<\/p>\s*)+(?:<ol(?:\sstyle=\"[^\"]+\")?\sstart=\"[^\"]+\">\s*)+/gi; 
    var nestedListItem = /<p>(?:&(?:nbsp|\#0*160|x0*A0);)+(?:\s[ivxlcdm]+\.)(?:&(?:nbsp|\#0*160|x0*A0);)+\s(.*?)<\/p>\s*/gi; 

    // fix nested lists 
    html = html.replace(nestedListFixer, function($0, $1){ 
     var lis = "" 
     $.each($0.match(nestedListItem), function() { 
      lis += "<li>" + this.replace(nestedListItem, "$1") + "</li>\n"; 
     }); 
     return "<ol>\n" + lis + "</ol></li>"; 
    }); 
}); 

...或者簡單的示例上面:

$(function() { 
    var textFixer = /(?:a)(?:b(.*?)c)+(?:d)/gi; 
    var textItem = /b(.*?)c/gi; 

    text = text.replace(textFixer, function($0, $1){ 
     var numbers = ""; 
     $.each($0.match(textItem), function() { 
      numbers += this.replace(textItem, "$1"); 
     }); 
     return numbers; 
    }); 
}); 

做一個.replace()置換,.match()陣列的循環內,insid自定義.replace()函數似乎並不是很經濟。它確實給了我想要的輸出。

4

你給了只會匹配「3」的最新例子不是「13467」像你描述。如果你改變你的正則表達式來做全局匹配,它會返回「36」,而不是「13467」。

你的第一個例子不輸出任何東西。

你只是試圖讓比賽通過比賽正則表達式和循環?

如果是這樣,

var text = '1ab2cb3cd4ab5cb6cd7'; 
var matches = text.match(/(\d)/g); 
for (i=0; i<matches.length; i++) { 
    alert(matches[i]); 
} 
+0

關閉,我正在嘗試遍歷特定組的匹配。所以對於「abcdcdef」.match(/ ab(cd)+ ef /)我如何循環通過$ 1的多個匹配? – travis 2009-08-11 20:30:15

1

一個漂亮的循環可以使用掛機模式:

var text = '1ab2cb3cd4ab5cb6cd7'; 
text.match(/(\d)/g).forEach(function(element,index){ 
    console.log(element) 
}); 
相關問題