我得到了一些(可能是恶意的)模板,这些模板混合了html + javascript + css (内联或作为外部链接)在“字符串”中
<!-- well known libs -->
<link href="//cdn/foolib.min.css" rel="stylesheet">
<script src="//cdn/foolib.min.js"></script>
<!-- this is the core of the template -->
<div>foo</div>
<style>body {}</style>
<script src="//cdn/foolib2.min.js"></script>
<link href="//cdn/foolib2.min.css" rel="stylesheet">
<script>
...javascript code...
</script>
<div id='foo'></div>
<style>#foo {}</style>
我想将其分解为3个“字符串”(或其他更方便的数据结构),其中包含纯html,脚本,css (有点像在所有jsfiddle克隆中找到的3个窗口)
html
<div>foo</div>
<div id='foo'></div>
脚本
<script src="//cdn/foolib.min.js"></script>
<script src="//cdn/foolib2.min.js"></script>
<script>
...javascript code...
</script>
css
<link href="//cdn/foolib.min.css" rel="stylesheet">
<style>body {}</style>
<link href="//cdn/foolib2.min.css" rel="stylesheet">
<style>#foo {}</style>
我想我必须解析该字符串并进行AST和处理,但是可能有人会帮助我。
答案 0 :(得分:0)
当您嵌套了langauge片段时,从根本上要做的是解析最外层语言(例如HTML),拾取这些语言元素,并捕获其他嵌入式语言的片段作为它们的任何子串类型(例如脚本文本) ),然后递归地重新处理嵌入语言的片段,直到用完嵌套为止。
您不一定会获得一种语言的简洁元素,因为在文本语言中进行此类嵌套的人们将包含机制视为任意预处理器。 因此,在PHP文件中,您可以找到最外面的PHP文本(在很大程度上看起来像HTML),包含的语言是实际的PHP代码。因此,您可能必须解析PHP as-HTML,真实的PHP代码和嵌套的JavaScript。如果“看起来像HMTL”部分恰好是脚本(例如JavaScript),则过渡点可能在关键字或变量名中间的过渡点中;我已经看到PHP代码与Javascript交替生成一个由JavaScript变量X1,X2等组成的“数组”,其中x sub i作为Javascript的一部分生成,随后是PHP,它发出id的数字部分
因此,您不能轻易地将这些语言解析为完整程序,整洁的语句甚至完整的关键字或标识符。这将使解析变得非常困难,并使解析程序的推理变得更加困难。考虑一个很好的想法,即PHP可能会为脚本语言吐出部分多行注释,然后有时吐出该注释的结尾或结尾。您将如何在早期和晚期之间对代码进行分类?
我们使用我们的工具来做很多这类事情。我们处理其中一些情况。我们不处理真正棘手的东西,因为它...很难。