Убрать первые элементы IMG в блоке HTML

У меня есть приложение PHP, которое захватывает HTML из сторонних источников, HTML может содержать один или несколько элементов IMG. Я хочу получить первый экземпляр IMG целиком, но не знаю, как это сделать.

Может ли кто-нибудь подтолкнуть меня в правильном направлении?

Спасибо.


person Ralph M. Rivera    schedule 01.11.2014    source источник
comment
Ознакомьтесь с stackoverflow.com/questions/3577641/   -  person jeroen    schedule 01.11.2014


Ответы (3)


Вы можете использовать XPath для синтаксического анализа html и извлечения нужных данных таким образом. Это немного сложнее, чем проверка позиции строки, но имеет то преимущество, что он немного более надежен, если вы решите, что вам нужно что-то более конкретное (например, src и alt первого тега img).

Сначала вы загружаете строку html в DOMDocument, который затем загружается в XPath.

// Load html in to DOMDocument, set up XPath
$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXPath($doc);

Нам нужен первый img, который встречается на странице, поэтому используйте селектор /descendant::img[1]. Примечание. Это не то же самое, что //img[1], хотя часто может давать аналогичные результаты. здесь есть хорошее объяснение разницы между ними.

$matches = $xpath->evaluate("/descendant::img[1]");

Обратной стороной использования XPath является то, что он не позволяет легко сказать «верните мне полную строку, которая была сопоставлена ​​для этого тега img», поэтому мы можем собрать простую функцию, которая будет перебирать атрибуты сопоставленного узла и пересобрать тег img.

$tag = "<img ";
foreach ($node->attributes as $attr) {
    $vals[] = $attr->name . '="' . $attr->value . '"';
}
$tag .= implode(" ", $vals) . " />";

Собирая все вместе, получаем что-то вроде:

<?php
// Example html
$html = '<html><body>'
    . ' <img src="/images/my-image.png" alt="My image" width="100" height="100" />'
    . 'Some text here <img src="do-not-want-second.jpg" alt="No thanks" />';

// Load html in to DOMDocument, set up XPath
$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXPath($doc);

// Get the first img in the doc
// N.B. Not the same as "//img[1]" - see https://stackoverflow.com/a/453902/2287
$matches = $xpath->evaluate("/descendant::img[1]");
foreach ($matches as $match) {
    echo buildImgTag($match);
}

/**
 * Build an img tag given it's matched node
 *
 * @param DOMElement $node Img node
 *
 * @return Rebuilt img tag
 */
function buildImgTag($node) {
    $tag = "<img ";
    $vals = array();
    foreach ($node->attributes as $attr) {
        $vals[] = $attr->name . '="' . $attr->value . '"';
    }
    $tag .= implode(" ", $vals) . " />";

    return $tag;
}

```

Так что в целом это немного более сложный подход, чем выполнение strpos или регулярного выражения в html, но он должен предоставить вам большую гибкость, если вы решите сделать что-либо с тегом img, например, вытащить определенный атрибут.

person ConroyP    schedule 01.11.2014

Пример ниже будет работать, если вы предположите, что HTML является действительным HTML, однако мы не можем этого предполагать! Если вы на 100% уверены, что это будет действительный HTML-код, тогда используйте его, если нет, я бы посоветовал вам использовать ЛУЧШИЙ СПОСОБ, как показано ниже.

$html = '<br />First<img src="path/abc.jpg" />Next<img src="path/cde.jpg" />';

$start = stripos($html, '<img');
$extracted = substr($html, $start);
$end = stripos($extracted, '>');

echo substr($html, $start, $end+1);

Этот код даст вам: <img src="path/abc.jpg" />

  1. Найдите первое вхождение <img с помощью функции без учета регистра stripos
  2. Нарезать фактические данные, начиная с первой точки появления.
  3. Найдите первое вхождение > с помощью функции без учета регистра stripos
  4. Извлеките то, что находится между начальной и конечной точкой, с помощью substr.

ЛУЧШЕ:

PHP Simple HTML DOM Parser Вручную

// Create DOM from URL or file
$html = file_get_html('http://www.google.com/');

// Find all images 
foreach($html->find('img') as $element) {
       echo $element->src . '<br>';
}
  • Парсер HTML DOM, написанный на PHP5 +, позволяет очень легко манипулировать HTML!
  • Требуется PHP 5+.
  • Поддерживает недопустимый HTML.
  • Находите теги на HTML-странице с помощью селекторов, как в jQuery.
  • Извлекайте содержимое из HTML в одну строку.
person BentCoder    schedule 01.11.2014

jQuery может сделать это за вас.

$('img')[0]

Если он находится в небольшом разделе HTML на вашей странице, настройте селектор соответствующим образом.

person Scott    schedule 01.11.2014
comment
Это не очень полезно для приложения PHP. - person jeroen; 01.11.2014