2014-02-13 324 views
0

所以我想用javascript來代替文本體中HTML標籤之外的所有單詞。檢查下面的解釋。正則表達式匹配正則表達式模式外的所有內容

我想轉換此:

<tag with-attr="something"></tag><tag>Text to match</tag><tag>Text to Match</tag> 

...這樣的:

<tag with-attr="something"></tag><tag>Manipulated Text</tag><tag>Manipulated Text</tag> 

現在,我有一個正則表達式可以匹配所有的標籤和它包含文字:

\<[^>]*\> 

但我不知道如何invert的表達,可以這麼說。

編輯
另外,我也希望用replace/match功能,不split,因爲我想用新的信息傳回了保留標籤信息,並吐了一個工作頁面。

+1

使用split()而不是match()。 – dandavis

+0

你問:'\> [^ <] * \ <'? (開關>和<) – BMW

+0

@dandavis我不想丟失標籤,因爲我正在替換整個網頁,所以之後我需要標籤信息。我想使用替換功能。 –

回答

1

使用括號,包括分裂()正則表達式和進一步陣列方法使「流處理」相當簡單:

'<tag with-attr="something"></tag><tag>Text to match</tag>Text to Match<tag>' 
    .split(/(<[^>]+>)/).map(function(x,i){ 
    if(!(i%2) && x){ x= escape(x); } 
    return x; 
}).join(""); 

示例輸出:

"<tag with-attr="something"></tag><tag>Text%20to%20match</tag>Text%20to%20Match<tag>" 

逃逸()是隻是爲了顯示textContent確實已被改變... 我只保證輸入接近你的例子。深度嵌套或無效的HTML可能騙過任何正則表達式,但我敢肯定,別人會提起這件事......

+0

哇,非常有趣我現在會嘗試一下。 –

+0

非常感謝,我想我是在錯誤的地方尋找我的解決方案。今天學到了新的東西:) –

+0

np。我知道使用分裂有點奇怪,但有時候js有點奇怪... – dandavis

0

像這樣的事情

/>([^<>]*\w)</ 

演示在這裏:http://rubular.com/r/2QPLjOeMAu

現在你只需要替換如下內容:

var str = '<tag with-attr="something"></tag><tag>Text to match</tag><tag>Text to Match</tag>'; 
var res = str.replace(/>([^<>]*\w)</g, '>Manipulated text<'); 
console.log(res);