【发布时间】:2019-01-24 07:45:28
【问题描述】:
我尝试将 HTML 页面从远程服务器加载到 PHP 脚本中,该脚本应该使用 DOMDocument 类来操作 HTML。但我已经看到,DOMDocument 类删除了 HTML 页面附带的 Javascript 的某些部分。有一些类似的东西:
<script type="text/javascript">
//...
function printJSPage() {
var printwin=window.open('','haha','top=100,left=100,width=800,height=600');
printwin.document.writeln(' <table border="0" cellspacing="5" cellpadding="0" width="100%">');
printwin.document.writeln(' <tr>');
printwin.document.writeln(' <td align="left" valign="bottom">');
//...
printwin.document.writeln('</td>');
//...
}
</script>
但是 DOMDocument 发生了变化,即行
printwin.document.writeln('</td>');
到
printwin.document.writeln(' ');
还有很多其他的东西(即最后一个脚本标签不再存在。结果我得到了一个完全被破坏的页面,我无法进一步发送。
所以我认为,DOMDocument 在 Javascript 代码中的 HTML 标记存在问题,并尝试更正代码,以生成格式良好的文档。我可以阻止 DOMDocument 中的 Javascript 解析吗?
PHP代码片段是:
$stdin = file_get_contents('php://stdin');
$dom = new \DOMDocument();
@$dom->loadHTML($stdin);
return $dom->saveHTML(); // will produce wrong HTML
//return $stdin; // will produce correct HTML
我存储了两个 HTML 版本,并与 Meld 进行了比较。
我也测试过
@$dom->loadXML($stdin);
return $dom->saveHTML();
但我没有从对象中得到任何东西。
【问题讨论】:
-
可以复制3v4l.org/O0iEf
-
最初我认为这是 stackoverflow.com/questions/4029341/… 的副本,但在这个问题中似乎没有一个明智的解决方案,所以我将使用 DomDocument 无法处理脚本标签正确,大声说出来听起来很荒谬。我什至尝试将脚本内容包装在
<![CDATA[...]]>中,但这仍然不起作用 -
我也不能在解析之前包装脚本标签,也不能在页面上做任何事情。我从外部系统获取页面(我无法访问那里),但我需要一些 PHP 来对页面进行后处理,然后才能将它们传送到浏览器。
-
可能不是DOMDocument的问题,而是底层libxml2的问题。我已经用
xmllint --html --htmlout /tmp/mypage.html测试了我的页面,我得到了很多解析器错误,正是在 DOMDocument 删除标签的位置。
标签: javascript php domdocument