Вообще-то, это плохая идея использовать для подобных задач регулярные выражения. Лучше обратить внимание на разные HTML-парсеры, которые как раз для этого и созданы.
Однако, если уж и использовать регулярки, то в этом случае весь процесс нужно разделить на 2 этапа:
/* 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" ) ) [..] ) )
Имейте ввиду, что этот метод не сработает, если в атрибутах используются одинарные кавычки. Поэтому предварительно позаботьтесь о том, чтобы заменить их на двойные.
Просто один небольшой пример о том, как можно выполнить эту задачу, используя встроенные в 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 и его результаты более простым.
Вот ещё один совсем уж простой пример:
$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''); }