Reputation: 1988
I need the content the description 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;
}
Upvotes: 21
Views: 32672
Reputation: 480
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
Upvotes: 1
Reputation: 29
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...
Upvotes: 2
Reputation: 51950
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;
}
}
Upvotes: 39
Reputation: 75456
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;
}
Upvotes: 2
Reputation:
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;
Upvotes: 0