Php 如何解析包含javascript代码的html

Php 如何解析包含javascript代码的html,php,javascript,html,parsing,html-parsing,Php,Javascript,Html,Parsing,Html Parsing,可能重复: 如何解析包含JavaScript代码的HTML,如果可能,最好使用PHP脚本 例如: <a href="javascript:link(10, true);">link</a> 应替换为JavaScript函数返回的适当值,例如 <a href="http://www.example.com">link</a> 一个更复杂的例子是一个保存的facebook html页面,其中充斥着大量javascript代码 总结: 为

可能重复:

如何解析包含JavaScript代码的HTML,如果可能,最好使用PHP脚本

例如:

<a href="javascript:link(10, true);">link</a>

应替换为JavaScript函数返回的适当值,例如

<a href="http://www.example.com">link</a>

一个更复杂的例子是一个保存的facebook html页面,其中充斥着大量javascript代码

总结:
为带有html+javascript的页面返回DOM,但不能返回。单击时,
javascript:
URIs只需调用函数并让它做任何它想做的事情(可能包括导航到某处);它们不期望或使用返回值。在许多用例中,该函数可能根本不会导致任何导航。

DomDocument可用于解析PHP中的HTML,包括JS:

您可以使用HTML“呈现”JS,只需回显cURL或wget(或任何您使用的)的输出,而无需转义HTML字符。对于外部JS,您需要构建一个爬虫程序,它将对
DomDocument
脚本
标记进行爬虫,并获取适当的URL并将其加载到一个可以访问的位置,除非您直接从他们的服务器使用它,但我认为他们不会对此感到太高兴


编辑:在一些评论之后,我的新答案是:不,你可以给这个链接一个ID。这个解决方案不是javascript,而是jQuery

所以给链接一个Id或类

$('.link').each(function() {
    var functionName = 'link';
    var start = $(this).attr('href');
    remove = start.replace('javascript:', ''), 
        get = remove.replace(new RegExp('^'+functionName+'\(((.+\,?)+)\)\;?', 'g'), function(a, b, c) {
        return c.replace(/[()']/g,'')
    }), args = get.split(",");

    //read settings
    var firstArgument = args[0];
    $(this).attr('href', firstArgument)
});​
请注意,这只是一个例子

用法:

​<a class="link" href="javascript:link('http://facebook.com')"​>Hi</a>​​​​​​​​​​​​​​​​​​
​​​​​​​​​​​​​​​​​​​
这将形成实际的联系

然而,以这种方式添加新的论点是困难的,也不是很专业。 但是这应该是你想要的,我只是不知道你的链接函数实际上做了什么,所以我没有用布尔值添加参数。当然,这可能会变得更复杂,你可以编写一个函数,也可以这样做,但我只是为你写了这个非常快


查看。

怎么样?@Adnan,它不会将JavaScript解释为OP wantsI,我很确定这在一般情况下是不可能的。例如,如果
link
函数使用用户的鼠标坐标来决定要创建什么链接,会怎么样?因此,您希望使用PHP解析HTML字符串,但随后还要解释JavaScript代码?你的web服务器上有JavaScript解释器吗?嘿,这只是一个例子,我的观点是将JavaScript呈现为html“将JavaScript呈现为html”有一个复杂的世界,我相信你不理解@Michael说的。这是一项艰巨的任务。是的,这将比你想象的要复杂得多。@Adnan在哪里?我不确定你的意思我想@Adnan的意思是“什么时候DomDocument解析JS了?”。JS基本上是HTML标记/属性的文本内容,因此(上次我使用它时)脚本标记可以从DomDocument访问。我的意思是,他只是想从我在他的问题中看到的带HTML的JS。他实际上并不想以允许语法突出显示的方式解析JS……疯狂可能有点强,但我猜他并不完全理解解释这些链接所需的复杂性和上下文。@Vatev确实不理解,他需要直接集成一个JS引擎,因为JS可以以多种方式执行,唯一的方法是挂接到实际的链接重定向事件中,浏览器通常会在它移动到下一个链接之前触发该事件,这意味着他需要将自己的eval沙盒构建到JS或PHP中。让所有的功能都能正常工作是疯狂的,因此谷歌为什么不这么做,好吧,或者根本不做……对于从函数或通过更复杂的结构(如JQuery)动态构建的链接来说,这个答案是无用的。此外,它只预匹配链接,如果
link()
没有使用任何参数,它实际上不会执行JS代码来获取最终链接。此代码不会返回任何内容,如用户自己的示例所示:
它获取最终链接。也许不像OP那样做了,但那是因为我不知道他们的链接函数实际上是做什么的。这只是一个例子,你可以让它用于动态添加的链接。这是一个#1问题,为了理解JS,必须对其进行求值,以获得可变内容返回。还有,为什么facebook或其他人会在链接的
href
属性中加入一个函数,其参数是目标链接的参数?一个原因可能是出站代理可以保护用户不受恶意内容的影响(在本例中为fb的是'l.php'),但该函数仍然不会返回该代理链接,而是返回输入的初始潜在不安全参数。这就是为什么我真的不明白这个答案是如何起作用的。现在以OP发布的例子为例: