我目前正在构建一个可以接收请求并发送回响应的网络服务器。我已经设法将 Google v8 JavaScript 引擎的一个端口嵌入到我的项目中,我想解析一个请求的文件并运行其中的服务器端 JavaScript 代码。我决定将此代码包含在 2 个字符的括号内,<: 用于打开,:> 用于关闭。我开始用我写的代码来解析它,但是在遇到一些使代码更加混乱并且可能效率不高的问题之后,我决定继续尝试使用 RegEx(我让你研究它,因为我以前从未使用过它)。可是等等。在和我的朋友讨论之后,他给我发了这篇文章RegEx match open tags except XHTML self-contained tags我明白这不是一个好主意......所以我的问题是,我该如何解析这样的事情?(考虑到效率和干净的代码,毕竟它是一个网络服务器)。提前致谢!
问问题
142 次
2 回答
0
如果我理解得很好,您想获取“<”和“>”之间的所有内容,甚至是其中的“<”和“>”?嗯......因为你可以使用正则表达式,也许尝试找到第一个“<”,使计数器每下一个“<”增加,每个“>”减少。当计数器为 0 并且出现下一个“>”时:这里你已经结束了服务器端脚本。如果您将有一些嵌入的 HTML 并希望摆脱它们,请尝试检测“”“”或类似的东西。这个解决方案很慢,但我能想象到最简单的。
于 2013-02-10T22:31:28.230 回答
0
理想情况下,您想要做的是挂钩到 V8 的词法分析器,这样您最终就不会在字符串等内部捕获东西。但是,我查看了该 .NET 包装器的源代码,看起来它不允许进行太多自定义。相反,您可能想要创建一个小型状态机。您可能至少需要以下状态:
- 文字数据(用于您
<:
和:>
标签之外的内容) - 左尖括号(一旦您消耗了 a
<
并正在等待潜在的:
) - 脚本状态(用于你的
<:
和:>
标签内的东西) - 脚本双引号字符串状态
- 脚本双引号字符串转义状态
- 脚本单引号字符串状态
- 脚本单引号字符串转义状态
- 脚本斜线状态(用于注释和正则表达式1)
- 脚本行注释状态
- 脚本块注释状态
- 脚本块注释星状态
- 脚本正则表达式状态
- 脚本冒号状态(当您遇到 a
:
并且不确定>
接下来是 a 还是其他东西时)
写成正则表达式可能不会那么快,但它可以处理这样的代码:
Hello, world!
<:
document.write("At least you won't think the script :> ends there.");
:>
1再想一想,检测正则表达式可能并不容易。
于 2013-02-10T22:38:15.997 回答