Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么DOMDocument元素上的PHP foreach每两个元素发生一次?_Php - Fatal编程技术网

为什么DOMDocument元素上的PHP foreach每两个元素发生一次?

为什么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_

为什么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_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();