2017-08-10 41 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标记,您需要解析一些开始标记以便正确关闭它们。这个内存可以被构造成一个堆栈(你推动打开标签,弹出结束标签)。这正是下推自动机所具有的功能:具有堆栈的有限状态自动机。