Php Javascript编写文档的内容.写入一个变量


Php Javascript writing the content of document.write into a variable

我面临这个问题,但我不知道如何妥善解决。

我正在使用一个脚本:

<script type="text/javascript" src="http://www.gta4.it/stat/view_stats.js.php?mode=0">  </script>

输出单个document.write:

document.write('11');

这个数字是用JavaScript显示的。我想做的是得到这个document.write的内容,并将其写入另一个服务器上的变量,JavaScript或PHP。

任何想法?

像任何JavaScript函数一样,您可以劫持document.write并将其替换为您自己的函数:

<script>
    var oldWrite = document.write; // Save original function.
    var myValue = "";
    document.write = function(str) {myValue += str;}; // Overwrite function.
</script>
<script type="text/javascript" src="http://www.gta4.it/stat/view_stats.js.php?mode=0">  </script>
<script>
    document.write = oldWrite; // Restore old function.
    alert(myValue);
</script>

您可以在这里看到它的作用:http://jsfiddle.net/qwef4/

该脚本只是输出一个小的JavaScript片段—如果您想在PHP中捕获其结果,则不需要实际让它在浏览器中执行:

// Assuming you have [allow_url_fopen][1] enabled
$js = file_get_contents( 'http://www.gta4.it/stat/view_stats.js.php?mode=0');
$value = trim( str_replace( array( "document.write('", "');"), '', $js));
echo $value; // Outputs 9, the current value of the JS

演示

当然,如果你正在寻找一个更强大的解决方案,即使JS代码片段发生变化(引入空格,改变引号类型等),仍然可以工作,你可以使用regex从代码片段中提取数字。像这样的代码应该可以工作:

$js = file_get_contents( 'http://www.gta4.it/stat/view_stats.js.php?mode=0');
$value = preg_replace('/^'s*document'.write'('s*[''"]('d*)[''"]'s*')'s*;'s*$/im', '$1', $js);
echo $value; // Outputs 11, the now current value of the JS

演示

如果,出于某种原因,你想要/需要在捕获值之前让它在浏览器中执行,你可以做这样的事情,尽管我确信它不符合标准,看起来很黑客。

  1. <script>标签包装在容器中,可能是<span><div>
  2. 使用JS获取容器的内容
  3. 使用AJAX将结果发送到服务器。
样本(未测试):

<div id="stats_container">
    <script type="text/javascript" src="http://www.gta4.it/stat/view_stats.js.php?mode=0">  </script>
</div>
<script type="text/javascript"> 
    var value = document.getElementById( 'stats_container').innerHTML;
    alert( value); // Here you would use AJAX to send the value to a server
</script>

你可以在javascript/html中这样做

<span id="getvar" style="display: none;">
    <script type="text/javascript" src="http://www.gta4.it/stat/view_stats.js.php?mode=0">  </script>
</span>
<script type="text/javascript">
var getvar = document.getElementById('getvar');
var stat = parseInt(getvar.innerText || getvar.textContent);
</script>

编辑:我认为Brian Nickel的劫持是最好的解决方案,如果你想在JS中。如果这对你来说不是一个解决方案,你可以尝试下面我的解决方案。当然,对于服务器端检索,您仍然可以使用file_get_contents。

我想到的唯一(肮脏)的事情是,您使用iframe来加载包含您提到的脚本的页面。然后,您可以在实际页面中加载iframe,并将iframe中的内容抓取到一个变量中,如下所示:

$content = getContentFromIframe("something");
function getContentFromIframe(iFrameId){
    var myFrame = document.getElementById(iFrameId);
    return myFrame.contentWindow.document.body.innerHTML;
}
当然,在检索数据之后,您可以使用一些脚本从页面中删除iFrame。但是我假设你用一些样式隐藏了它。

如果你想在服务器端语言中设置值,比如PHP,你可以通过file_get_contents调用文件来获取文件的内容。