Как получить метаданные из HTML-файла с помощью PHP?


Я пытаюсь создать функцию на своем веб-сайте, где пользователи могут загружать ссылки, такие как Digg. У меня есть код, который захватывает исходный код HTML из URL, который пользователь загружает на мой сайт, и сохраняет его в a .txt-файл. Затем я хочу захватить содержимое в теге

<meta name="content" description="GRAB THIS"> 

Предполагая, что этот тег существует. Иногда это работает, но в других случаях это не работает, даже если исходный код для этой конкретной веб-страницы содержит необходимый мета-тег точно так, как я указал в своем коде. Я заметил, что кажется не правильно работать, если "захватить эту" содержат HTML-сущности (&, и т. д.). Пожалуйста, дайте мне знать, если у вас есть какие-либо идеи о том, как заставить это работать. Вот мой код:

$html_data = file_get_contents( $path_to_txt_file_that_contains_html );
preg_match( '#<meta name="description" content="(.+?)">#si', $html_data, $tor;
$tor = str_replace ( '<meta name="description" content="' , "", $tor[0] );
$tor = str_replace ( '">', "", $tor );

Иногда $tor все еще содержит

<meta name="description" content="CONTENT"

Но без закрытия >, поэтому мой код ломается, как только я помещаю это в базу данных mySQl. Есть идеи, что я делаю не так? Заранее спасибо за любую помощь!

2 3

2 ответа:

На самом деле все очень просто.

PHP предлагает собственное встроенное решение: http://php.net/manual/en/function.get-meta-tags.php

Большинство людей посоветуют вам использовать DomDocument для синтаксического анализа html. Хотя я согласен в большинстве ситуаций, иногда просто проще использовать регулярное выражение. Итак, поскольку вы используете регулярное выражение в своем вопросе, вот решение для регулярного выражения.

$html_data = file_get_contents( $path_to_txt_file_that_contains_html );
preg_match( '#<meta name="description".*content="([^"]+)">#siU', $html_data, $tor);
$tor = $tor[1];

Это непроверено, но должно отлично работать в вашей ситуации.