1

我目前正在构建一个可以接收请求并发送回响应的网络服务器。我已经设法将 Google v8 JavaScript 引擎的一个端口嵌入到我的项目中,我想解析一个请求的文件并运行其中的服务器端 JavaScript 代码。我决定将此代码包含在 2 个字符的括号内,<: 用于打开,:> 用于关闭。我开始用我写的代码来解析它,但是在遇到一些使代码更加混乱并且可能效率不高的问题之后,我决定继续尝试使用 RegEx(我让你研究它,因为我以前从未使用过它)。可是等等。在和我的朋友讨论之后,他给我发了这篇文章RegEx match open tags except XHTML self-contained tags我明白这不是一个好主意......所以我的问题是,我该如何解析这样的事情?(考虑到效率和干净的代码,毕竟它是一个网络服务器)。提前致谢!

4

2 回答 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 回答