2012-11-20 78 views
0

首先我是新來的stackoverflow,所以我很抱歉,如果我發佈在錯誤的部分。正則表達式來改變HTML標記內的文本

我需要一個正則表達式的HTML標籤中搜索並替換 - 用_ 例如:

<TAG-NAME>-100</TAG-NAME> 

將成爲

<TAG_NAME>-100</TAG_NAME> 

需要注意的是,在標籤內的值不影響。

任何人都可以幫忙嗎?

謝謝。

+4

歡迎使用stackoverflow!你能向我們展示你自己的嘗試嗎?你使用哪種語言或工具?最後強制性的...... [你不應該使用正則表達式來解析HTML](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) –

+0

那麼我正在使用別的東西來解析一些xmls。這不是一個真正的html標籤,但我認爲這會讓東西變得更容易理解。我嘗試過,如果不同的reg表達式並在regexpal上測試它們,但沒有幫助,或者我得到-100,或者我也得到標記的文本... – user1839059

+0

@ user1839059正則表達式aren'對於XML比HTML更好)。既然你使用正則表達式,我假設你使用JavaScript? –

回答

1

由於JavaScript是語言DOM操作,你通常應該考慮適當地解析XML和使用,而不是正則表達式JavaScript的DOM遍歷功能。

Here is some example code on how to parse an XML document這樣就可以使用DOM遍歷函數。然後,您可以遍歷所有元素並更改其名稱。這將自動排除文本節點,屬性,評論和所有其他惱人的事情,你不想改變。

如果它是一個正則表達式,這裏是一個臨時解決方案。請注意,這將嚴重失敗,您是否有屬性名稱或註釋標籤內(甚至只有>)(事實上,它也將適用於更換,以評論):

str = str.replace(/-(?=[^<>]*>)/g, '_'); 

這將與-如果是之後是>,之前未遇到<。這個概念被稱爲negative lookaheadg修飾符確保所有的事件都被替換。

請注意,這將替換爲>前面的任何內容。即使屬性值。如果你不想,你也可以確保有偶數連字符和結束>,這樣之間的報價:

str = str.replace(/-(?=[^<>"]*(?:"[^<>"]*"[^<>"]*)*>)/g, '_'); 

這仍然會改變屬性雖然。

Here is a regexpal demo that shows what works and what doesn't work.特別是評論行爲是相當可怕的。當然,這可以用一個更復雜的正則表達式來處理,但是我想你會看到這是怎麼回事?你真的應該,真的使用XML解析器!

+0

非常感謝,這正是我想要的。 – user1839059

0
s/(\<[^\>]+\>)\-([^\<]+\<\/)/\1_\2/ 

雖然我不熟悉JS庫,但我很肯定會有更好的庫來解析HTML。

+0

不是真的JS,是嗎? ;) –

+0

@ m.buettner否:(但它是一個普通的正則表達式,所以JS應該有類似的東西? – texasbruce

+0

是的,你的正則表達式的問題是,它必須多次運行('g'修飾符不會幫助)因爲匹配不能重疊,所以只有一個'-'會被替換 –