I need the content the d开发者_如何学JAVAescription and the keywords tag content. I have this code, but dont write anything. Idea?
$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;
}
You can reference the attributes using @
followed by the attribute name (see below), and you can query directly for the attributes; your XPath query was almost there.
// 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;
}
}
You have two problems. First, name is an attribute so you need to prepend @,
$nodes = $xpath->query('/html/head/meta[@name="description"]');
Second, the nodes are all empty so there is nothing to print.
To print the attribute value, do this,
foreach($nodes as $node){
$attr = $node->getAttribute('content');
print $attr;
}
In stead of including the /html/head part you could also use double slash which means that the following node can be anywhere in the code:
//meta[@name='description']
Will give the same result as:
/html/head/meta[@name='description']
Doesn't really matter much but it's less typing...
Last but not least, and sorry for reviving this thread, the queries are case sensitive.
In other words, if you look for meta name="description"... or "meta name="keywords", it will not find "meta name="Description"... or "meta name="Keywords"... respectively. So careful with that!
And I can tell you, after working a while with xdom and metatags, eventually I believe that the best approach for that is to use this function: http://php.net/manual/es/function.get-meta-tags.php
Make sure that you put EOD;
at a line without any spaces and indentation like:
$str = <<< EOD
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
EOD;
精彩评论