PHP DOMDOCUMENT getNamedItem

时间:2014-06-13 11:53:15

标签: php domdocument

我在这里回应了我需要的网页中的类元素(=' titre'),但我如何回应它们的价值呢?似乎无法使其发挥作用。

$html = file_get_contents('http://www.spoofedwebpage.int/notice/search/wanted');
$dom = new DOMDocument;
$dom->loadHTML($html);
$dom->preserveWhiteSpace = false;
$divs = $dom->getElementsByTagName('div');  // Sample to get div element
$spans = $dom->getElementsByTagName('span');  // Sample to get div element


$i = 0;
while($span = $spans->item($i++))
{
    $class_node = $span->attributes->getNamedItem('class');
    if($class_node)
    {
        if($class_node->value == "titre")
        {   
        echo "Class is : " . $span->attributes->getNamedItem('class')->value . 
"<br>";
    }
}
}

1 个答案:

答案 0 :(得分:2)

类属性有点特殊,因为它们是令牌列表(由空格分隔的几个类名),但我建议你使用Xpath来获取节点:

$html = <<<'HTML'
  <div class="titre foo">abc</div>
  <span class="titre bar">def</span> 
  <div class="bar">hij</div>
HTML;

$dom = new DOMDocument;
$dom->loadHTML($html);
$dom->preserveWhiteSpace = false;
$xpath = new DOMXpath($dom);

$expression = '//*[(self::div or self::span) and contains(concat(" ", normalize-space(@class), " "), " titre ")]';

foreach ($xpath->evaluate($expression) as $node) {
  echo "Text is: ", $node->nodeValue, "\n";
}

输出:https://eval.in/162248

Text is: abc
Text is: def

关于表达:

选择文档中的任何元素......

//*

...如果是divspan ...

//*[(self::div or self::span)]

... class属性包含类名titre

//*[ (self::div or self::span) and contains(concat(" ", normalize-space(@class), " "), " titre ") ]

normalize-space()接受一个字符串并将所有空白组转换为单个空格。它也从字符串的开头和结尾去除空格。 concat用于向规范化字符串的开头和结尾添加单个空格。结果是一串类名称,如 SPACE CLASS_ONE SPACE CLASS_TWO SPACE 。这允许它查找像 SPACE CLASS_ONE SPACE 这样的子字符串。

btw 您确定要查找titre而不是title吗?

提示原始答案选择了类属性,如果您对此感兴趣,请参阅history