2013-03-09 72 views
-1

我想在標籤中查找除「a」之外的所有「<span class="get">habbitant morbi</span> triastbbitique」中的「a」的匹配項(請參閱下面的**之間的「a」)。JavaScript中的正則表達式以匹配XML標記之外

<span class="get">h*a*bbit*a*nt morbi</span> tri*a*stbbitique.

如果我找到他們,我要取代他們,也是我想保存原來的標籤。

這個表達式不起作用:

var variable = "a"; 
var reg = new RegExp("[^<]."+variable+".[^>]$",'gi'); 
+4

我建議,把文本內容第一,然後運行你的正則表達式。 – scunliffe 2013-03-09 22:22:02

+0

您可能想要檢查問題的格式。 – Zeta 2013-03-09 22:22:15

+1

我很想知道你真正想要歸檔的東西。請澄清問題和語言。 – TheHippo 2013-03-09 22:24:18

回答

2

請注意,這個問題不是關於解析。這很輕鬆。正則表達式經常被正確使用的東西。

如果你想用正則表達式去有一對夫婦,你可以做到這一點的方式。

  • 一個簡單的黑客先行,如:

    a(?![^<>]*>) 
    

    注意,這不會處理的標籤<>報價在標籤/轉義外正常。

  • 形式的完全成熟的分詞器:

    (expression for tag|comments|etc)|(stuff outside that that i'm interested in) 
    

    與不依賴於哪個部分被匹配不同事物的函數替換。如果$1匹配它將在它的自我來代替,如果$2 matchehd與*$2*


完整的分詞方法當然不是一個簡單的任務,在spec isn't small更換。

但如果簡化到只匹配的基本標籤,忽略CDATA,註釋,腳本/風格標籤,等等,你可以使用以下命令:

var str = '<span class="a <lal> a" attr>habbitant 2 > morbi. 2a < 3a</span> triastbbitique'; 

var re = /(<[a-z\/](?:"[^"]*"|'[^']*'|[^'">]+)*>)|(a)/gi; 

var res = str.replace(re, function(m, tag, a){ 
    return tag ? tag : "*" + a + "*"; 
}); 

結果:

<span class="a <lal> a" attr>h*a*bbit*a*nt 2 > morbi. 2*a* < 3*a*</span> tri*a*stbbitique 

該手柄雜亂的標籤,引號和在HTML中未轉義的</>


用正則表達式符號化的HTML標籤(應該翻譯罰款JS正則表達式)的幾個例子:

+0

謝謝,它的工作原理。 – Matt 2013-03-09 23:03:39

3

我會建議to not use a regular expression to parse HTML;這不是一個正規的語法,除了簡單的情況之外,你將會遇到痛苦。

你的問題仍然是一個有點不清楚,但讓我嘗試改寫,看看我是不是正確的:

你想獲得一個給定的字符串的所有匹配的HTML文檔中,除了在比賽中<tag>屍體?


假設你正在使用jQuery或類似:

// Let the browser parse it for you: 
var container = document.createElement() 
container.innerHTML = '<span class="get">habbitant morbi</span> triastbbitique' 
var doc_text = $(container).text() 

// And then you can just regex away normally: 
doc_text.match(/a/gi) 

(更妙的是使用DOMParser,但不具有廣泛的瀏覽器支持還)

如果」在Node中,然後你想找一些幫助你解析HTML節點的庫(比如jsdom);然後把所有的下一個節點都畫出來。

+0

這實際上並不解析HTML。它標記了HTML,正則表達式非常適合。 – Qtax 2013-03-09 22:40:16

+0

如果HTML寫得很好,當然。但是,如果'variable'包含'<' or '>'而且你想在文本節點中找到它的實例呢?有很多情況下,瀏覽器不會像這樣非轉義的控制字符閃爍,並將它們放置在文本節點中,而不是形成標籤。例如 – Nevir 2013-03-09 22:41:34

+0

' foo < bar'。你不能假定某人已經足夠好了,可以爲你編寫<' – Nevir 2013-03-09 22:43:33