2017-08-10 38 views
-1

如前所述,我試圖用RegExp將一些html標籤轉換爲其他自定義標籤。如何使用RegExp轉換嵌套<span>標籤

我的解決方案是不是在嵌套的標籤工作如下:

解決方案1:

var str = '<span style=\"font-size: x-large;\"><span style=\"color: red;\">HELLO WORLD</span></span>'; 
var txt = str.replace(/<span style=\"(font-size|color): (.*?);\">(.*?)<\/span>/gim,"[$2]$3[/$2]"); 

的例外結果:

[x-large][red]HELLO WORLD[/red][/x-large] 

實際結果:

[x-large]<span style="color: red;">[/x-large]</span> 

解決方案2:

var str = '<span style=\"font-size: x-large;\"><span style=\"color: red;\">HELLO WORLD</span></span>'; 
var txt = str.replace(/<span style=\"(font-size|color): (.*?);\">(.*?)<\/span>/gim,"[$2]$3[/$2]"); 
txt = txt.replace(/<span style=\"(font-size|color): (.*?);\">(.*?)<\/span>/gim,"[$2]$3[/$2]"); 

的例外結果:

[x-large][red]HELLO WORLD[/red][/x-large] 

實際結果:

[x-large][red]HELLO WORLD[/x-large][/red] 
+0

Regexp不夠智能,無法處理涉及嵌套的HTML等語言。 – 2017-08-10 03:19:33

+0

[你不應該](https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454)。 –

+0

[RegEx匹配除XHTML自包含標記之外的開放標記]的可能重複(https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) – pchaigno

回答

0

TL; DR。只能使用正則表達式解析任意數量的嵌套HTML標記。爲了正確解析結束標記,您需要記住您解析的開始標記。

注意:您可能能夠使用正則表達式解析有限數量的嵌套HTML標記,儘管它很快會變成一團糟。

爲什麼我們不能用正則表達式解析HTML?

Chomsky hierarchyHTML是一種上下文無關語言正則表達式對應於正規語言。您的正則表達式被編譯爲有限狀態自動機,它們不具備(計算上)足夠強大的功能來識別上下文無關語言。要識別上下文無關語言,您需要一個下推自動機。

要解析任意數量的嵌套HTML標記,您需要解析一些開始標記以便正確關閉它們。這個內存可以被構造成一個堆棧(你推動打開標籤,彈出結束標籤)。這正是下推自動機所具有的功能:具有堆棧的有限狀態自動機。