РЕДАКТИРОВАТЬ: теперь, когда я знаю лучше
Использование regexp для решения такого рода проблем является плохой идеей и, вероятно, приведет к появлению неисправимого и ненадежного кода. Лучше использовать HTML-парсер .
Решение с регулярным выражением
В этом случае лучше разбить процесс на две части:
- получить все теги img
- извлечь их метаданные
Я предполагаю, что ваш документ не является строгим 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"
)
)
[..]
)
)
Регулярные выражения требуют значительных ресурсов процессора, поэтому вы можете кэшировать эту страницу. Если у вас нет системы кэширования, вы можете настроить свою собственную, используя ob_start и загрузку / сохранение из текстового файла.
Как это работает?
Сначала мы используем preg_ match_ all , функцию, которая получает каждую строку, соответствующую шаблону, и выводит ее в свой третий параметр.
Регулярные выражения:
<img[^>]+>
Мы применяем его на всех html-страницах. Он может быть прочитан как каждая строка, которая начинается с "<img
", содержит не ">" символ и заканчивается> .
(alt|title|src)=("[^"]*")
Мы применяем его последовательно к каждому тегу img. Он может читаться как каждая строка, начинающаяся с «alt», «title» или «src», затем «=», затем «», куча вещей, которые не являются «» и заканчиваются на « '"'. Изолировать подстроки между () .
Наконец, каждый раз, когда вы хотите разобраться с регулярными выражениями, удобно иметь хорошие инструменты для их быстрого тестирования. Проверьте это онлайн тестер регулярных выражений .
РЕДАКТИРОВАТЬ: ответ на первый комментарий.
Это правда, что я не думал о (надеюсь, мало), что люди используют одинарные кавычки.
Хорошо, если вы используете только ', просто замените все "на'.
Если вы смешаете оба. Сначала вы должны дать себе пощечину :-), затем попытаться использовать ("| ') вместо или" и [^ ø] для замены [^ "].