在PHP中解释JavaScript

15
我希望能够在PHP中运行JavaScript并获取结果,想知道是否有一个PHP库可以让我解析它。我的第一想法是使用node.js,但由于node.js可以访问套接字、文件和其他东西,所以我认为最好避免使用它。
原因:我正在用PHP进行屏幕抓取,并遇到许多情况下数据是由前端JavaScript生成的,我希望避免编写专门的过滤函数以针对每种情况处理JavaScript,因为那需要很多时间。更普遍的情况是直接解析JavaScript。
反对票:我真的不明白这个问题有什么争议,现代网络爬虫已经可以做到这一点,唯一的区别是它们往往不是用PHP编写的。 [1]
[1] http://blogs.forbes.com/velocity/2010/06/25/google-isnt-just-reading-your-links-its-now-running-your-code/

6
你为什么要这样做?!如果你一定要这样做,可以编译并运行一个CLI JavaScript解释器:http://code.google.com/p/v8/。 - Blender
3
为了什么目的?PHP已经有大量的日期函数了。 - bcosca
3个回答

6

这是一个有趣的问题,但是那些给出负面评价的人并没有想到潜在的用途。页面存档工具、打印脚本、预览图像 - 这些都是希望通过其中包含的JavaScript操作文档的有效原因。

我不知道是否存在现有的PHP实现,但你可以将Mozilla的SpiderMonkey作为PHP模块进行改编,或者作为独立工具来操作DOMDocument并返回结果。

我没有使用过服务器端JavaScript,但我认为可能需要处理以下一些问题:

  • 宿主对象如documentwindow不是ECMAScript规范的一部分(这些是由实现浏览器提供的对象),因此您需要确保库提供等效的宿主对象。
  • 您可能会遇到在服务器端环境下执行客户端脚本的安全问题。这很像允许用户提交要求评估的PHP脚本,因此您需要确保安全沙箱非常严密。

另一个(也许)更安全、更易于实现的选择可能是使用修改过的FireFox或WebKit实例作为浏览器运行,加载目标页面并将修改后的源代码返回给您的应用程序。


我很高兴你指出了文档和窗口的问题,这个问题我没有想到。如果我最后想要解决这个问题,我会按照你建议的方式去编写一个 PHP 模块来解决。 - Kit Sunde
@KitSunde 看看selenium吧。它允许你从任何语言控制浏览器。对于node.js开发者来说,他们往往放弃使用node.js,转而使用phantom.js,所以即使是node.js开发者也会面临这个问题。Phantom.js不是node.js,也不是node.js的库(尽管有一些库可以让node.js控制phantom)。Phantomjs是一个浏览器,而不是解释器(它是Google Chrome的一个分支),具有窗口、选项卡等,但这些窗口从未在屏幕上绘制出来。它是一个无头浏览器。 - slebetman
@slebetman 谢谢,自从我提出这个问题以来,我已经了解到Selenium有7年了。 :p - Kit Sunde

4
从PHP 5.3开始,你可以使用V8JS PHP扩展。它是一个本地库,使用新的Google V8 Javascript引擎执行JS并返回结果。
这很好,因为你可以通过PHP数组传递变量,并且被解释得非常好。

1

NodeJS(或者谷歌V8的其他衍生版本)可能是这里最好的选择。如果你担心NodeJS可以做的各种事情(例如套接字等),你可以通过删除模块和/或插件来“削减”它 - 我认为即使内置的东西也是以这样一种方式实现的,可以相对容易地剥离。

另一种方法可能是简单地替换、覆盖或删除node.js中的require函数。

还有envjs,它应该可以更轻松地运行设计用于浏览器的JavaScript。


我以前从未见过envjs,这真的很有趣。我会进一步研究它,谢谢。 :) - Kit Sunde
不客气。祝你好运。(不要被投票者打击) - Lee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接