Как извлечь img src, title и alt из html с помощью php? [Дубликат]

140
задан Andy Lester 27 May 2015 в 12:59
поделиться

5 ответов

РЕДАКТИРОВАНИЕ: теперь, когда я знаю лучше

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

Решение С regexp

В этом случае лучше разделить процесс на две части:

  • добираются, весь тег 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"
                )

        )

   [..]
        )

)

Regexps являются ЦП, интенсивным, таким образом, можно хотеть кэшировать эту страницу. Если у Вас нет системы кэша, можно настроить собственное при помощи ob_start и загружающийся / сохраняющий от текстового файла.

, Как это наполняет работу?

Первый, мы используем preg_ match_ весь , функция, которая получает каждое сопоставление строк шаблон и ouput он в, он - третий параметр.

regexps:

<img[^>]+>

Мы применяем его на все веб-страницы HTML. Это может быть считано как [1 110] каждая строка, которая запускается с" <img", содержит не">" символ и заканчивается a> .

(alt|title|src)=("[^"]*")

Мы применяем его последовательно на каждый тег img. Это может быть считано как [1 111] каждая строка, запускающаяся с "высокого звука", "заголовка" или "src", тогда "=", тогда '"', набор материала, которые не являются '"' и концы с a '"'. Изолируйте подстроки между () .

Наконец, каждый раз Вы хотите иметь дело с regexps, это удобный для имения хороших инструментов для быстрого тестирования их. Проверьте это regexp тестер онлайн .

РЕДАКТИРОВАНИЕ: ответьте на первый комментарий.

Это верно, что я не думал о (надо надеяться, немногие) люди, использующие одинарные кавычки.

ну, если Вы используете только', просто заменяют весь "'.

, Если Вы смешиваете обоих. Сначала необходимо хлопнуть себя:-), затем попытайтесь использовать (" | ') вместо этого или" и [^Гё] для замены [^ "].

191
ответ дан Community 27 May 2015 в 12:59
поделиться

Только дать небольшой пример использования функциональности 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 более простыми.

64
ответ дан Stefan Gehrig 27 May 2015 в 12:59
поделиться

Если это - 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"
  }
}
8
ответ дан DreamWerx 27 May 2015 в 12:59
поделиться

Сценарий должен быть отредактирован следующим образом

foreach ($ result [0] as $ img_tag)

, потому что preg_match_all возвращает массив массивов

5
ответ дан 23 November 2019 в 22:56
поделиться
$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');
}
244
ответ дан 23 November 2019 в 22:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: