解析一个包含HTML的文件以获得服务器端的脚本
本文关键字:文件 脚本 服务器端 HTML 包含 一个 | 更新日期: 2023-09-27 17:58:30
我目前正在构建一个web服务器,它可以接收请求并发回响应。我已经设法将谷歌v8 JavaScript引擎的一个端口嵌入到我的项目中的c#(JavaScript.net)中,我想解析一个请求的文件并运行其中的服务器端JavaScript代码。我决定将此代码包含在2个字符的括号中,<:用于打开和:>用于关闭。我开始用我写的代码解析它,但在遇到一些问题后,这些问题使代码变得更加混乱,可能效率不高,我决定继续尝试使用RegEx(我让你研究它,因为我以前从未使用过它)。但是等一下。在和我的朋友讨论过之后,他给我发了这篇RegEx匹配开放标签的帖子,除了XHTML自包含标签,我明白这不是一个好主意。。。所以我的问题是,我该如何解析这些东西?(考虑到效率和干净的代码,毕竟这是一个网络服务器)。提前感谢!
理想情况下,您想要做的是挂接V8的lexer,这样您就不会捕获字符串等内部的东西。然而,我查看了.NET包装器的源代码,它似乎不允许进行太多的自定义。相反,您可能想要创建一个小型状态机。你可能至少想要这些州:
- 文字数据(用于
<:
和:>
标签之外的内容) - 左括号(表示您消耗了
<
并正在等待潜在的:
) - 脚本状态(用于
<:
和:>
标记中的内容) - 编写双引号字符串状态脚本
- 脚本双引号字符串转义状态
- 编写单引号字符串状态脚本
- 编写单引号字符串转义状态脚本
- 脚本斜杠状态(用于注释和正则表达式1)
- 脚本行注释状态
- 脚本块注释状态
- 脚本块注释星形状态
- 编写正则表达式状态脚本
- 编写冒号状态脚本(用于遇到
:
并且不确定下一个是>
还是其他内容时)
它可能不像正则表达式那样快速编写,但它可以处理这样的代码:
Hello, world!
<:
document.write("At least you won't think the script :> ends there.");
:>
1仔细想想,检测正则表达式可能不那么容易。
如果我理解得很好,你想拿走"<"answers">"之间的所有东西,甚至是其中的"<"answers">"?好由于您可以使用RegEx进行此操作,也许可以尝试先查找"<",使计数器每增加一个"<",每减少一个">"。计数器何时为0,下一个">"出现:这里是服务器端脚本的末尾。如果你有一些嵌入的HTML,并且想去掉它们,试着检测"或类似的东西。这个解决方案很慢,但却是我能想象到的最简单的。