我面临这个问题,但我不知道如何妥善解决。
我正在使用一个脚本:
<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
演示如果,出于某种原因,你想要/需要在捕获值之前让它在浏览器中执行,你可以做这样的事情,尽管我确信它不符合标准,看起来很黑客。
- 将
<script>
标签包装在容器中,可能是<span>
或<div>
- 使用JS获取容器的内容
- 使用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调用文件来获取文件的内容。