PHP,DOMElement只获取当前节点的值

时间:2017-01-03 18:19:13

标签: php html domdocument

这是我的代码:

<?php

$html = '<a href="url">My Asked text for value <span class="time">15min</span></a>';

$dom = new DOMDocument;
@$dom->loadHTML($html);

$links = $dom->getElementsByTagName('a');
foreach ($links as $link){print_r($link);
         echo $link->nodeValue."\n"; // returns: My Asked text for value 15min
}

返回:我的问题文字价值15分钟

但我只想:我的问题文字

如何解决这个问题,thx

4 个答案:

答案 0 :(得分:3)

当然可以使用解析器方法:

<?php
$html = '<a href="url">My Asked text for value <span class="time">15min</span></a>';

$dom = new DOMDocument;
@$dom->loadHTML($html);

$links = $dom->getElementsByTagName('a');
foreach ($links as $link){
    if ($link->hasChildNodes()) {
        echo $link->childNodes[0]->nodeValue;
    } else {
        echo $link->nodeValue;
    }
}

输出显然是:

My Asked text for value 

但是,如果这是有道理的,那么使用孩子的规则看起来有点模糊......

更新:

对于过时的php版本&lt; 5.6.3您需要稍加修改的版本,因为类DomNodeList仅从该版本向上实现ArrayAccess接口:

<?php
$html = '<a href="url">My Asked text for value <span class="time">15min</span></a>';

$dom = new DOMDocument;
@$dom->loadHTML($html);

$links = $dom->getElementsByTagName('a');
foreach ($links as $link){
    if ($link->hasChildNodes()) {
        echo $link->childNodes->item(0)->nodeValue;
    } else {
        echo $link->nodeValue;
    }
}

答案 1 :(得分:1)

只需更改此代码行:

echo $link->nodeValue."\n";

有了这个:

echo $link->childNodes->item(0)->nodeValue."\n";
// output "My Asked text for value" 

在此example

中查看

答案 2 :(得分:0)

您可以使用替换方法。或者如果字符串每次新的&#34; 15分钟或20分钟&#34;然后你可以使用正则表达式:)

str-replace here

或正则表达式preq_match

  $newString = str_replace("15min", "", $link->nodeValue);

答案 3 :(得分:0)

似乎还有很长的路要走,但你可以剥掉标签。

echo strip_tags($link->nodeValue."\n");