Используя regexp решать этот вид проблемы, плохая идея и вероятно введет неудобный в сопровождении и ненадежный код. Лучше используйте синтаксический анализатор HTML .
В этом случае лучше разделить процесс на две части:
, я предположу, что Ваш документ не xHTML строгий, таким образом, Вы не можете использовать синтаксический анализатор XML. НАПРИМЕР, с этим исходным кодом веб-страницы:
/* preg_match_all match the regexp in all the $html string and output everything as
an array in $result. "i" option is used to make it case insensitive */
preg_match_all('/<img[^>]+>/i',$html, $result);
print_r($result);
Array
(
[0] => Array
(
[0] => <img src="/Content/Img/stackoverflow-logo-250.png" width="250" height="70" alt="logo link to homepage" />
[1] => <img class="vote-up" src="/content/img/vote-arrow-up.png" alt="vote up" title="This was helpful (click again to undo)" />
[2] => <img class="vote-down" src="/content/img/vote-arrow-down.png" alt="vote down" title="This was not helpful (click again to undo)" />
[3] => <img src="http://www.gravatar.com/avatar/df299babc56f0a79678e567e87a09c31?s=32&d=identicon&r=PG" height=32 width=32 alt="gravatar image" />
[4] => <img class="vote-up" src="/content/img/vote-arrow-up.png" alt="vote up" title="This was helpful (click again to undo)" />
[...]
)
)
Тогда мы получаем все атрибуты тега img с циклом:
$img = array();
foreach( $result as $img_tag)
{
preg_match_all('/(alt|title|src)=("[^"]*")/i',$img_tag, $img[$img_tag]);
}
print_r($img);
Array
(
[<img src="/Content/Img/stackoverflow-logo-250.png" width="250" height="70" alt="logo link to homepage" />] => Array
(
[0] => Array
(
[0] => src="/Content/Img/stackoverflow-logo-250.png"
[1] => alt="logo link to homepage"
)
[1] => Array
(
[0] => src
[1] => alt
)
[2] => Array
(
[0] => "/Content/Img/stackoverflow-logo-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"
)
)
[..]
)
)
Regexps являются ЦП, интенсивным, таким образом, можно хотеть кэшировать эту страницу. Если у Вас нет системы кэша, можно настроить собственное при помощи ob_start и загружающийся / сохраняющий от текстового файла.
Первый, мы используем preg_ match_ весь , функция, которая получает каждое сопоставление строк шаблон и ouput он в, он - третий параметр.
regexps:
<img[^>]+>
Мы применяем его на все веб-страницы HTML. Это может быть считано как [1 110] каждая строка, которая запускается с" <img
", содержит не">" символ и заканчивается a> .
(alt|title|src)=("[^"]*")
Мы применяем его последовательно на каждый тег img. Это может быть считано как [1 111] каждая строка, запускающаяся с "высокого звука", "заголовка" или "src", тогда "=", тогда '"', набор материала, которые не являются '"' и концы с a '"'. Изолируйте подстроки между () .
Наконец, каждый раз Вы хотите иметь дело с regexps, это удобный для имения хороших инструментов для быстрого тестирования их. Проверьте это regexp тестер онлайн .
РЕДАКТИРОВАНИЕ: ответьте на первый комментарий.
Это верно, что я не думал о (надо надеяться, немногие) люди, использующие одинарные кавычки.
ну, если Вы используете только', просто заменяют весь "'.
, Если Вы смешиваете обоих. Сначала необходимо хлопнуть себя:-), затем попытайтесь использовать (" | ') вместо этого или" и [^Гё] для замены [^ "].
Только дать небольшой пример использования функциональности PHP XML для задачи:
$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 и результаты xpath более простыми.
Если это - XHTML, Ваш пример, Вам нужно только simpleXML.
<?php
$input = '<img src="/image/fluffybunny.jpg" title="Harvey the bunny" alt="a cute little fluffy bunny"/>';
$sx = simplexml_load_string($input);
var_dump($sx);
?>
Вывод:
object(SimpleXMLElement)#1 (1) {
["@attributes"]=>
array(3) {
["src"]=>
string(22) "/image/fluffybunny.jpg"
["title"]=>
string(16) "Harvey the bunny"
["alt"]=>
string(26) "a cute little fluffy bunny"
}
}
Сценарий должен быть отредактирован следующим образом
foreach ($ result [0] as $ img_tag)
, потому что preg_match_all возвращает массив массивов
$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');
}