You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP代码无法捕获服务器名称数组,请求排查问题

问题描述

我需要提取class为server的<li>元素下的<span class="label">中的服务器名称(从ADLIVECYCES2-P1到lhewbawas01)并存入数组。目标HTML片段如下:

<span class="label">ITCAM for AD/WebSphere/J2EE</span> (26)
    <ul>
        <li class="server"><span class="label">ADLIVECYCES2-P1</span></li>
        <li class="server"><span class="label">ADLIVECYCES2-P2</span></li>
        <li class="server"><span class="label">J168-L168</span></li>
        <li class="server"><span class="label">WAS linux webapplication</span></li>
        <li class="server"><span class="label">WAS linux webservice</span></li>
        <li class="server"><span class="label">WAS windows Adobe2</span></li>
        <li class="server"><span class="label">WASzos linux webservice</span></li>
        <li class="server"><span class="label">lhewbawas01</span></li>
    </ul>
</li>
<li class="callerType">

我编写了如下PHP代码,但运行后$resultarray变量为空,请问代码哪里有问题?

<?php

 include('C:\Manutenzione\Analisi_TT\simple_html_dom.php');

$ip_soatt04='myIP';

$usr_soatt = 'root';
$pwd_soatt = 'mypwd';
$dom = new DomDocument();
    
    $connection_soatt04 = ssh2_connect($ip_soatt04, 22);
    
    if (!$connection_soatt04)
    {
        echo "impossibile connettersi a soatt04";
    }
        
    ssh2_auth_password($connection_soatt04, $usr_soatt , $pwd_soatt);
    
    $stream = ssh2_exec($connection_soatt04,'cat /opt/sw/db_viewer/todata_summary.html');
    
    stream_set_blocking($stream, true);
    
    $stream_out=stream_get_contents($stream);

    $dom->loadHTML($stream_out);
    $xpath = new DOMXpath($dom);
    
    $heading=parseToArray($xpath,'server');
    
function parseToArray($xpath,$class)
{
    $xpathquery="//li[@class='".$class."']/span";
    $elements = $xpath->query($xpathquery);
    

    if (!is_null($elements)) {  
        $resultarray=array();
        foreach ($elements as $element) {
            $nodes = $element->childNodes;
            foreach ($nodes as $node) {
              $resultarray[] = $node->nodeValue;
            }
        }
        return $resultarray;
    }
}

    
            
?>
问题分析与修复

你的代码存在以下几个关键问题:

  • XPath查询精度不足
    原XPath仅匹配server类<li>下的所有<span>,但目标<span>还有label类属性。实际页面中可能存在其他无label类的<span>干扰,或DOM解析后结构差异导致匹配失败。应将查询条件细化:

    $xpathquery = "//li[@class='".$class."']/span[@class='label']";
    
  • HTML解析错误未处理
    DomDocument::loadHTML()对不规范HTML会静默忽略错误,可能导致DOM结构解析异常。需添加错误抑制和清理:

    libxml_use_internal_errors(true); // 禁用libxml错误输出
    $dom->loadHTML($stream_out);
    libxml_clear_errors(); // 清除解析错误
    
  • 文本获取逻辑冗余
    遍历childNodes获取文本是多余的,直接调用$element->nodeValue即可拿到<span>的完整文本,还可通过trim()去除多余空格:

    foreach ($elements as $element) {
        $resultarray[] = trim($element->nodeValue);
    }
    
  • 边界情况未处理
    当无匹配元素时,原函数未返回明确值,会默认返回null。需确保函数始终返回数组:

    return $resultarray ?? [];
    
修复后的完整代码
<?php

include('C:\Manutenzione\Analisi_TT\simple_html_dom.php');

$ip_soatt04 = 'myIP';
$usr_soatt = 'root';
$pwd_soatt = 'mypwd';
$dom = new DomDocument();

$connection_soatt04 = ssh2_connect($ip_soatt04, 22);
if (!$connection_soatt04) {
    echo "impossibile connettersi a soatt04";
    exit; // 连接失败直接终止后续执行
}

ssh2_auth_password($connection_soatt04, $usr_soatt, $pwd_soatt);

$stream = ssh2_exec($connection_soatt04, 'cat /opt/sw/db_viewer/todata_summary.html');
stream_set_blocking($stream, true);
$stream_out = stream_get_contents($stream);

// 处理不规范HTML的解析错误
libxml_use_internal_errors(true);
$dom->loadHTML($stream_out);
libxml_clear_errors();

$xpath = new DOMXpath($dom);
$heading = parseToArray($xpath, 'server');

// 打印结果用于测试
print_r($heading);

function parseToArray($xpath, $class)
{
    $xpathquery = "//li[@class='".$class."']/span[@class='label']";
    $elements = $xpath->query($xpathquery);
    
    $resultarray = [];
    if ($elements->length > 0) { // 检查是否有匹配元素
        foreach ($elements as $element) {
            $resultarray[] = trim($element->nodeValue);
        }
    }
    return $resultarray;
}
?>

内容的提问来源于stack exchange,提问作者Fabio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:24:55