我需要内容描述和关键字标签内容。我有这个代码,但不要写任何东西。想法?
$str = <<< EOD
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta name="description" content="text in the description tag" />
<meta name="keywords" content="text, in, the, keywords, tag" />
</head>
EOD;
$dom = new DOMDocument();
$dom->loadHTML($str);
$xpath = new DOMXPath($dom);
$nodes = $xpath->query('/html/head/meta[name="description"]');
foreach($nodes as $node){
print $node->nodeValue;
}
答案 0 :(得分:28)
您可以使用@
后跟属性名称(参见下文)来引用属性,并且可以直接查询属性;你的XPath查询几乎就在那里。
// Look for the content attribute of description meta tags
$contents = $xpath->query('/html/head/meta[@name="description"]/@content');
// If nothing matches the query
if ($contents->length == 0) {
echo "No description meta tag :(";
// Found one or more descriptions, loop over them
} else {
foreach ($contents as $content) {
echo $content->value . PHP_EOL;
}
}
答案 1 :(得分:2)
你有两个问题。首先,name是一个属性,因此您需要预先添加@,
$nodes = $xpath->query('/html/head/meta[@name="description"]');
其次,节点都是空的,因此无需打印。
要打印属性值,请执行此操作,
foreach($nodes as $node){
$attr = $node->getAttribute('content');
print $attr;
}
答案 2 :(得分:1)
除了包含/ html / head部分,您还可以使用双斜杠,这意味着以下节点可以在代码中的任何位置:
//meta[@name='description']
将给出与以下相同的结果:
/html/head/meta[@name='description']
并不重要,但输入的次数较少......
答案 3 :(得分:0)
确保将EOD;
放在一行,没有任何空格和缩进,如:
$str = <<< EOD
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
EOD;