【问题标题】:PHP DOMXPath - Can't target the right nodePHP DOMXPath - 无法定位正确的节点
【发布时间】:2016-01-19 04:07:40
【问题描述】:

我知道这可能在其他线程中有所涉及,但我一直在 StackOverflow 上搜索并尝试了许多解决方案,这就是我问的原因。

有了这个 html:

<div class="someclass">
<table>
    <tbody>
        <tr>
            <th class="state">Status</th>
            <th class="name">Name</th>
            <th class="type">Type</th>
            <th class="length">Length</th>
            <th class="height">Height</th>
        </tr>
        <tr>
            <td class="state state2"></td>
            <td class="name"></td>
            <td class="type t18"></td>
            <td class="length">2000 m</td>
            <td class="height"></td>
        </tr>
        <tr>
            <td class="state state1"></td>
            <td class="name"></td>
            <td class="type t18"></td>
            <td class="length">2250 m</td>
            <td class="height"></td>
        </tr>
        <tr>
            <td class="state state1"></td>
            <td class="name"></td>
            <td class="type t18"></td>
            <td class="length">3000 m</td>
            <td class="height"></td>
        </tr>
        <tr>
            <td class="state state2"></td>
            <td class="name"></td>
            <td class="type t18"></td>
            <td class="length">2250 m</td>
            <td class="height"></td>
        </tr>
    </tbody>
</table>
</div>

现在,这是我目前的 PHP 代码:

$dom = new DOMDocument();
$dom->loadHtmlFile('http://www.whatever.com');
$dom->preserveWhiteSpace = false;

$xp = new DOMXPath($dom);
$col = $xp->query('//td[contains(@class, "state1") and (contains(@class, "state"))]');
$length = 0;

foreach( $col as $n ) {
    $parent = $n->parentNode;
    $length += $parent->childNodes->item(3)->nodeValue; 
}
echo 'Length: ' . $length;

我需要:

1.- 对“长度”值求和以便我可以回显它们,摆脱给定值的“m”子字符串

2.- 了解为什么我在“parentNodes”、“childNodes”和“item()”部分出错。经过多次尝试,我得到了“长度:0”

我知道这不是获得完整详细解释的地方,但是很难找到针对这些具体问题的教程。如果有人能就我在哪里可以获得这些信息提供一些建议,那就太好了。

非常感谢。

为简单起见编辑了“Concat”部分。

【问题讨论】:

  • 您在执行查询的那一行有语法错误。
  • 谢谢,你能告诉我那个语法错误是什么吗?看不到。
  • 您没有在 concat 函数中转义 '
  • 对不起@Musa,这里显然是初学者......我仍然没有看到错误。
  • 在 concat 内你有 ' ' ,要在单引号字符串中使用单引号,你必须用 \(斜杠)转义它

标签: php domxpath


【解决方案1】:

使用 DOMXpath 浏览指定 childNode 值的 DOMDocument

function getInt($string)
{
    preg_match("/[0-9]+/i", $string, $val);

    $out = 0;
    if (isset($val) && !empty($val))
    {
        $out = $val[0];
    }

    return intval($out);
}

$dom = new DOMDocument();
$dom->loadHtml($html);
$dom->preserveWhiteSpace = false;

$xp = new DOMXPath($dom);
$length = 0;

foreach($xp->query('//td[@class="state state1"]/following-sibling::*[3]') as $element)
{
    $value = $element->nodeValue;
    $length += getInt($value);
}


echo $length;

【讨论】:

  • 谢谢。你能详细解释一下吗?
  • 对于您提供的给定 DOM,从节点获取值 3000 m 和 2250 m 然后传递给 getInt() 函数以从字符串中获取 int 部分并在这种情况下一一返回 int 值两个值并将返回值与当前 $length 值相加 ...
  • 它似乎可以访问所有子节点的值,好吧,让我再挖掘一下
  • 它对所有长度求和,不区分'state1'和'state2'等。检查eval.in/504086
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-27
  • 1970-01-01
  • 2010-10-13
相关资源
最近更新 更多