Я создаю метатеги для поиска и открытия графика.
Для тега meta description я хотел бы установить значение динамически на основе конкатенации содержимого двух элементов html на странице.
Например, если это фрагмент моего html:
<div class="report-description-text">
<h5>Description</h5>
Set of drawers
<br/>
И еще один фрагмент в другом месте документа:
<p class="report-when-where">
<span class="r_date">09:58 Apr 5 2014 </span>
<span class="r_location">123 main St, Toronto, ON, Canada</span>
</p>
Мне бы хотелось, чтобы мой метатег:
echo '
<meta name="description" content="Set of drawers at 123 main St, Toronto, ON, Canada" />
Немного новое для php и кода в целом. Я также провел некоторое исследование на этом сайте и нашел ответ в виде использования DOMinnerHTML и функции foreach.
Это самый простой способ? Как мне это сделать?
Способ использования DOMDocument и XPath:
$dom = new DOMDocument();
@$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$query = '//div[@class = "report-description-text"]/h5[.="Description"]'
. '/following-sibling::text()[1]';
$description = trim($xpath->query($query)->item(0)->textContent);
$query = '//p[@class = "report-when-where"]/span[@class = "r_location"]/text()';
$location = trim($xpath->query($query)->item(0)->textContent);
$meta = $dom->createElement('meta');
$meta->setAttribute('name', 'Description');
$meta->setAttribute('content', $description . ' at ' . $location);
// only needed if the head tag doesn't exist
if (!$dom->getElementsByTagName('head')->item(0)):
$head = $dom->createElement('head');
$dom->getElementsByTagName('html')->item(0)->insertBefore($head,
$dom->getElementsByTagName('body')->item(0));
endif;
$dom->getElementsByTagName('head')->item(0)->appendChild($meta);
$result = $dom->saveHTML(); // or saveXML if you want xhtml
echo htmlspecialchars($result);