为什么DOMDocument元素上的PHP foreach每两个元素发生一次?
为什么DOMDocument元素上的foreach循环每2个节点发生一次 我的意思是,它剪切和粘贴节点1、3、5等。忘记使用2、4、6执行此操作,但为什么DOMDocument元素上的PHP foreach每两个元素发生一次?,php,Php,为什么DOMDocument元素上的foreach循环每2个节点发生一次 我的意思是,它剪切和粘贴节点1、3、5等。忘记使用2、4、6执行此操作,但$dom\u body\u scripts->length返回int(6) 代码: //准备文档 $dom=新的DOMDocument('1.0','utf-8'); $dom->preserveWhiteSpace=false; $dom->loadHTML($buffer); $dom->formatOutput=true; //钩子 $dom_
$dom\u body\u scripts->length
返回int(6)
代码:
//准备文档
$dom=新的DOMDocument('1.0','utf-8');
$dom->preserveWhiteSpace=false;
$dom->loadHTML($buffer);
$dom->formatOutput=true;
//钩子
$dom_head=$dom->getElementsByTagName('head')->项(0);
//钩子
$dom_body=$dom->getElementsByTagName('body')->item(0);
//标签
$dom_body_scripts=$dom_body->getElementsByTagName('script');
//从中剪切每个标记并将其附加到
foreach($dom\u body\u脚本作为$script){
如果($script->getAttribute('type')='text/javascript'){
$dom_head->appendChild($script);
}
}
返回$dom->saveHTML();
HTML输入示例:
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<script type="text/javascript" src="/test0.js"></script>
<script type="text/javascript" src="/test1.js"></script>
</body>
</html>
HTML输出示例:
<!DOCTYPE html>
<html lang="en">
<head>
<script type="text/javascript" src="/test0.js"></script>
</head>
<body>
<script type="text/javascript" src="/test1.js"></script>
</body>
</html>
代码的问题在于,
$dom\u body\u scripts
不是数组列表,这就是为什么不能对所有找到的结果进行迭代
为此,基于$dom\u body\u脚本
的结果,我对其进行了一个分析,它将获得$dom\u body
中的所有脚本
:
<?php
$str = <<<DATA
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<script type="text/javascript" src="/test0.js"></script>
<script type="text/javascript" src="/test1.js"></script>
</body>
</html>
DATA;
// Prepare DOMDocument
$dom = new DOMDocument('1.0', 'utf-8');
$dom->preserveWhiteSpace = false;
$dom->loadHTML($str);
$dom->formatOutput = true;
// hook <head>
$dom_head = $dom->getElementsByTagName('head')->item(0);
// hook <body>
$dom_body = $dom->getElementsByTagName('body')->item(0);
// <script> tags in <body>
$dom_body_scripts = $dom_body->getElementsByTagName('script');
// cut each <script> tag from <body> and append it to <head>
for($i = $dom_body_scripts->length; $i > 0; $i--)
{
$script = $dom_body->getElementsByTagName('script')->item($i - 1);
if ($script->getAttribute('type') === 'text/javascript')
{
$dom_head->appendChild($script);
}
}
echo $dom->saveHTML();
展示一个您正在使用的HTML示例,该示例为您提供了该行为,以便我们可以查看是否可以复制它。输入和输出:这可能与DOM*将所有脚本放在一行有关
<?php
$str = <<<DATA
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<script type="text/javascript" src="/test0.js"></script>
<script type="text/javascript" src="/test1.js"></script>
</body>
</html>
DATA;
// Prepare DOMDocument
$dom = new DOMDocument('1.0', 'utf-8');
$dom->preserveWhiteSpace = false;
$dom->loadHTML($str);
$dom->formatOutput = true;
// hook <head>
$dom_head = $dom->getElementsByTagName('head')->item(0);
// hook <body>
$dom_body = $dom->getElementsByTagName('body')->item(0);
// <script> tags in <body>
$dom_body_scripts = $dom_body->getElementsByTagName('script');
// cut each <script> tag from <body> and append it to <head>
for($i = $dom_body_scripts->length; $i > 0; $i--)
{
$script = $dom_body->getElementsByTagName('script')->item($i - 1);
if ($script->getAttribute('type') === 'text/javascript')
{
$dom_head->appendChild($script);
}
}
echo $dom->saveHTML();