Хотя регулярные выражения могут быть полезны для самых разных задач, я считаю, что при анализе HTML DOM обычно не хватает. Проблема с HTML заключается в том, что структура вашего документа настолько изменчива, что трудно точно (и я имею в виду 100% -ный показатель успеха без ложных срабатываний) извлечь тег.
Я рекомендую вам использовать синтаксический анализатор DOM, например phpQuery
, и использовать его так:
function get_first_image($html){
$dom = phpQuery::newDocument($html);
$first_img = $dom->find('img:first');
if($first_img !== null) {
return $first_img->attr('src');
}
return null;
}
Кто-то может подумать, что это излишне, но, в конце концов, его будет проще поддерживать, а также обеспечит большую расширяемость. Например, используя анализатор DOM, я также могу получить атрибут alt.
Регулярное выражение может быть разработано для достижения той же цели, но оно будет ограничено таким образом, что атрибут alt
будет следовать после src
или наоборот, а преодоление этого ограничения добавит больше сложности. к регулярному выражению.
Кроме того, учтите следующее. Чтобы правильно сопоставить тег <img>
с помощью регулярных выражений и получить только атрибут src
(захваченный в группе 2), вам необходимо следующее регулярное выражение:
<\s*?img\s+[^>]*?\s*src\s*=\s*(["'])((\\?+.)*?)\1[^>]*?>
И снова, вышеописанное может завершиться неудачей, если:
- Имя атрибута или тега указано заглавными буквами, а модификатор
i
не используется.
- Кавычки не используются вокруг атрибута
src
.
- Другой атрибут, тогда
src
использует символ >
где-то в своем значении.
- Какую-то другую причину, которую я не предвидел.
Опять же, просто не используйте регулярные выражения для разбора документа dom.