如上所述,我正在尝试使用RegExp将一些html标签转换为其他自定义标签。
我的解决方案无法在嵌套代码中使用,如下所示:
解决方案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 :(得分:0)
TL; DR。您无法仅使用正则表达式解析任意数量的嵌套HTML标记。您需要对解析的开始标记进行一些记忆才能正确解析结束标记。
注意:您可能能够使用正则表达式解析有限数量的嵌套HTML标记,尽管它很快就会变得一团糟。
为什么我们不能用正则表达式解析HTML?
在Chomsky hierarchy中, HTML是无上下文语言,而正则表达式对应于常规语言。您的正则表达式被编译为有限状态自动机,它们(计算上)不够强大,无法识别无上下文语言。要识别无上下文语言,您需要一个下推自动机。
要解析任意数量的嵌套HTML标记,您需要对已解析的开始标记进行一些记忆才能正确关闭它们。这个内存可以被构造成一个堆栈(你推动打开标签,并弹出关闭标签)。这正是一个下推自动机:带有堆栈的有限状态自动机。