2015-06-02 20 views
1

我輸入的是:無法理解爲什麼代替()是不是在這裏工作

'<div><strong>test</strong><div><strong>kkk</strong></div><div><strong>111</strong></div></div>' 

和輸出必須是:

'<div><strong>test</strong><div><strong>kkk</strong></div><div>111</div></div>' 

<strong>標籤從111解開)

這是我到目前爲止:

var input = '<div><strong>test</strong><div><strong>kkk</strong></div><div><strong>111</strong></div></div>'; 
 

 
var effect = 'strong', // dynamic 
 
    selectedText = '111'; // dynamic 
 

 
var regex = new RegExp('<' + effect + '>.*' + selectedText + '.*<\/' + effect + '>'); 
 
         
 
if(regex.test(input)){ 
 
    console.log('replacing'); 
 
    input = input.replace(regex, selectedText); 
 
} 
 

 
console.log(input);

出於某種原因,它給我的輸出爲:我該如何解決這個<div>111</div></div>

+2

請不要使用正則表達式處理xml/html ... –

+1

@CommuSoft什麼是更好的選擇,爲什麼它更好? –

+3

你可以例如[創建一個虛擬DOM](http://stackoverflow.com/a/10585079/67579),然後重寫它,或使用xpath。這更好,因爲[正則表達式不能處理遞歸結構](http://stackoverflow.com/questions/701166/can-you-provide-some-examples-of-why-it-is-hard-to-解析的XML和HTML的-與-A-REG)。 –

回答

3

你目前的正則表達式<strong>.*111.*<\/strong>匹配得太多(=貪婪)。

你只需要消耗無標籤與[^<>]*

var input = '<div><strong>test</strong><div><strong>kkk</strong></div><div><strong>111</strong></div></div>'; 
 

 
var effect = 'strong', // dynamic 
 
    selectedText = '111'; // dynamic 
 

 
var regex = new RegExp('<' + effect + '>([^<>]*)' + selectedText + '([^<>]*)</' + effect + '>'); 
 
// Or this one if you do not want to keep any text around the selectedText 
 
//var regex = new RegExp('<' + effect + '>([^<>]*)' + selectedText + '([^<>]*)</' + effect + '>'); 
 
         
 
if(regex.test(input)){ 
 
    console.log('replacing'); 
 
    input = input.replace(regex, "$1" + selectedText + "$2"); 
 
    // Or this one if you opt to replace the whole text with your selectedText 
 
    // input = input.replace(regex, selectedText); 
 
} 
 

 
console.log(input);

+0

'([^ <>] *)'+ selectedText +'([^ <>] *)'和'「$ 1」+ selectedText +「$ 2」)''以防萬一你想保留'selectedText '。如果你不想保留它,你可以使用原來的建議。什麼工作更好?我現在添加了兩個選項來回答問題。 –

+0

兩者都很好,不能說哪一個更好。我會做一些測試並讓你知道。 –

+1

不要做幾個測試,做幾個毫釐。我保證,只要你用正則表達式處理XML,有人可以編寫一個測試用例,讓你的代碼給出錯誤的答案。 –

1

.*在你的正則表達式是貪婪的匹配,也就是說,它會盡量覆蓋儘可能多的輸入成爲可能同時仍然讓整個表達匹配。卸下通配符修復該問題:

var input = '<div><strong>test</strong><div><strong>kkk</strong></div><div><strong>111</strong></div></div>'; 
 

 
var effect = 'strong', // dynamic 
 
    selectedText = '111'; // dynamic 
 

 
var regex = new RegExp('<' + effect + '>' + selectedText + '<\/' + effect + '>'); 
 
         
 
if(regex.test(input)){ 
 
    console.log('replacing'); 
 
    input = input.replace(regex, selectedText); 
 
} 
 

 
console.log(input);

輸出:

"replacing" js:21:4 
"<div><strong>test</strong><div><strong>kkk</strong></div><div>111</div></div>" 

as CommuSoft mentioned in the comments,像 XML的特定HTML或工具是查詢和操作一個更好的選擇嵌套的XML或HTML結構。你的操作可以看作是從一個嵌套結構到另一個嵌套結構的轉換,因此可能是需要看的東西。

相關問題