Как на PHP извлечь из HTML картинки и их атрибуты (title и alt)?

Вообще-то, это плохая идея использовать для подобных задач регулярные выражения. Лучше обратить внимание на разные HTML-парсеры, которые как раз для этого и созданы.

Однако, если уж и использовать регулярки, то в этом случае весь процесс нужно разделить на 2 этапа:

  • получение IMG-тегов
  • извлечение из них мета-данных

Получаем IMG-теги

/* preg_match_all находит все совпадения по регулярному выражению в строке $html и помещает их в массив $result. Параметр "i" задает поиск без учёта регистра. */
preg_match_all(''/<img[^>]+>/i'',$html, $result);

Пример результата, который будет содержать массив $result (один элемент массива — одна строка):

<img src="/Content/Img/250.png" width="250" height="70" alt="logo link to homepage" />
<img class="vote-up" src="/content/img/vote-arrow-up.png" alt="vote up" title="This was helpful (click again to undo)" />
<img class="vote-down" src="/content/img/vote-arrow-down.png" alt="vote down" title="This was not helpful (click again to undo)" />
<img src="http://www.gravatar.com/avatar/df299babc56f0a79678e567e87a09c31?s=32&d=identicon&r=PG" height=32 width=32 alt="gravatar image" />
<img class="vote-up" src="/content/img/vote-arrow-up.png" alt="vote up" title="This was helpful (click again to undo)" />

Затем обойдём наш массив в цикле и извлечём требуемые атрибуты:

$img = array();
foreach( $result as $img_tag)
{
preg_match_all(''/(alt|title|src)=("[^"]*")/i'',$img_tag, $img[$img_tag]);
}

На выходе мы получим вот-такой массив массивов, в котором сохранятся нужные нам элементы.

Array
(
[<img src="/Content/Img/250.png" width="250" height="70" alt="logo link to homepage" />] => Array
(
[0] => Array
(
[0] => src="/Content/Img/250.png"
[1] => alt="logo link to homepage"
)

[1] => Array
(
[0] => src
[1] => alt
)

[2] => Array
(
[0] => "/Content/Img/250.png"
[1] => "logo link to homepage"
)

)

[<img class="vote-up" src="/content/img/vote-arrow-up.png" alt="vote up" title="This was helpful (click again to undo)" />] => Array
(
[0] => Array
(
[0] => src="/content/img/vote-arrow-up.png"
[1] => alt="vote up"
[2] => title="This was helpful (click again to undo)"
)

[1] => Array
(
[0] => src
[1] => alt
[2] => title
)

[2] => Array
(
[0] => "/content/img/vote-arrow-up.png"
[1] => "vote up"
[2] => "This was helpful (click again to undo)"
)

)

[<img class="vote-down" src="/content/img/vote-arrow-down.png" alt="vote down" title="This was not helpful (click again to undo)" />] => Array
(
[0] => Array
(
[0] => src="/content/img/vote-arrow-down.png"
[1] => alt="vote down"
[2] => title="This was not helpful (click again to undo)"
)

[1] => Array
(
[0] => src
[1] => alt
[2] => title
)

[2] => Array
(
[0] => "/content/img/vote-arrow-down.png"
[1] => "vote down"
[2] => "This was not helpful (click again to undo)"
)

)

[<img src="http://www.gravatar.com/avatar/df299babc56f0a79678e567e87a09c31?s=32&d=identicon&r=PG" height=32 width=32 alt="gravatar image" />] => Array
(
[0] => Array
(
[0] => src="http://www.gravatar.com/avatar/df299babc56f0a79678e567e87a09c31?s=32&d=identicon&r=PG"
[1] => alt="gravatar image"
)

[1] => Array
(
[0] => src
[1] => alt
)

[2] => Array
(
[0] => "http://www.gravatar.com/avatar/df299babc56f0a79678e567e87a09c31?s=32&d=identicon&r=PG"
[1] => "gravatar image"
)

)

[..]
)

)

Имейте ввиду, что этот метод не сработает, если в атрибутах используются одинарные кавычки. Поэтому предварительно позаботьтесь о том, чтобы заменить их на двойные.

Ответ №2

Просто один небольшой пример о том, как можно выполнить эту задачу, используя встроенные в PHP средства:

$doc=new DOMDocument();
$doc->loadHTML("<html><body>Test<br><img src=\"myimage.jpg\" title=\"title\" alt=\"alt\"></body></html>");
$xml=simplexml_import_dom($doc); // just to make xpath more simple
$images=$xml->xpath(''//img'');
foreach ($images as $img) {
echo $img[''src''] . '' '' . $img[''alt''] . '' '' . $img[''title''];
}

Я использовал метод DOMDocument::loadHTML(), потому что он может справиться с HTML-синтаксом и при этом не требует, чтобы входной документ был именно XHTML. Грубо говоря, конвертация в SimpleXMLElement не является необходимой — она просто делает использование xpath и его результаты более простым.

Ответ №3

Вот ещё один совсем уж простой пример:

$url="http://example.com";
$html = file_get_contents($url);
$doc = new DOMDocument();
@$doc->loadHTML($html);
$tags = $doc->getElementsByTagName(''img'');
foreach ($tags as $tag) {
echo $tag->getAttribute(''src'');
}