Подтвердить что ты не робот

Используя регулярные выражения для извлечения первого источника изображения из html-кодов?

Я хотел бы знать, как это может быть достигнуто.

Предположим, что существует много html-кода, содержащего таблицы, divs, изображения и т.д.

Проблема. Как получить совпадения всех событий. Более того, чтобы быть конкретным, как я могу получить источник тега img (src=?).

Пример:

<img src="http://example.com/g.jpg" alt="" />

Как я могу распечатать http://example.com/g.jpg в этом случае. Я хочу предположить, что есть и другие теги в html-коде, как я упоминал, и, возможно, несколько изображений. Можно ли иметь массив всех источников изображений в html-коде?

Я знаю, что это может быть достигнуто так или иначе с помощью регулярных выражений, но я не могу понять его.

Любая помощь очень ценится.

4b9b3361

Ответ 1

Хотя регулярные выражения могут быть полезны для большого числа задач, я нахожу, что это обычно не подходит при анализе HTML DOM. Проблема с HTML заключается в том, что структура вашего документа настолько изменчива, что трудно точно (и, точно, я имею в виду 100% -ный шанс успеха без ложных срабатываний), извлеките тег.

Я рекомендую вам использовать DOM-парсер, например SimpleHTML и использовать его как таковой

function get_first_image($html) {
    require_once('SimpleHTML.class.php')

    $post_html = str_get_html($html);

    $first_img = $post_html->find('img', 0);

    if($first_img !== null) {
        return $first_img->src;
    }

    return null;
}

Некоторые могут подумать, что это слишком много, но в конце концов, это будет легче поддерживать, а также позволяет увеличить расширяемость. Например, используя парсер DOM, я также могу получить атрибут alt.

Регулярное выражение можно было бы разработать для достижения одной и той же цели, но было бы ограничено таким образом, чтобы он заставлял атрибут alt быть после src или наоборот, и преодоление этого ограничения добавило бы больше сложности к регулярному выражению.

Также рассмотрим следующее. Чтобы правильно совместить тег <img> с использованием регулярных выражений и получить только атрибут src (снятый в группе 2), вам понадобится следующее регулярное выражение:

<\s*?img\s+[^>]*?\s*src\s*=\s*(["'])((\\?+.)*?)\1[^>]*?>

И снова, вышеприведенное может завершиться ошибкой, если:

  • Имя атрибута или тега находится в капитале, а модификатор i не используется.
  • Цитаты не используются вокруг атрибута src.
  • Другой атрибут src использует символ > где-то в своем значении.
  • Некоторая другая причина, которую я не предвидел.

Итак, снова просто не используйте регулярные выражения для анализа документа dom.


РЕДАКТИРОВАТЬ: Если вы хотите все изображения:

function get_images($html){
    require_once('SimpleHTML.class.php')

    $post_dom = str_get_dom($html);

    $img_tags = $post_dom->find('img');

    $images = array();

    foreach($img_tags as $image) {
        $images[] = $image->src;
    }

    return $images;
}

Ответ 2

Используйте это, более эффективно:

preg_match_all('/<img [^>]*src=["|\']([^"|\']+)/i', $html, $matches);
foreach ($matches[1] as $key=>$value) {
    echo $value."<br>";
}

Пример:

$html = '
<ul>     
  <li><a target="_new" href="http://www.manfromuranus.com">Man from Uranus</a></li>       
  <li><a target="_new" href="http://www.thevichygovernment.com/">The Vichy Government</a></li>      
  <li><a target="_new" href="http://www.cambridgepoetry.org/">Cambridge Poetry</a></li>      
  <img width="190" height="197" border="0" align="right" alt="upload.jpg" title="upload.jpg" class="noborder" src="value1.jpg" />
  <li><a href="http://www.verot.net/pretty/">Electronaut Records</a></li>      
  <img width="190" height="197" border="0" align="right" alt="upload.jpg" title="upload.jpg" class="noborder" src="value2.jpg" />
  <li><a target="_new" href="http://www.catseye-crew.com">Catseye Productions</a></li>     
  <img width="190" height="197" border="0" align="right" alt="upload.jpg" title="upload.jpg" class="noborder" src="value3.jpg" />
</ul>
<img width="190" height="197" border="0" align="right" alt="upload.jpg" title="upload.jpg" class="noborder" src="res/upload.jpg" />
  <li><a target="_new" href="http://www.manfromuranus.com">Man from Uranus</a></li>       
  <li><a target="_new" href="http://www.thevichygovernment.com/">The Vichy Government</a></li>      
  <li><a target="_new" href="http://www.cambridgepoetry.org/">Cambridge Poetry</a></li>      
  <img width="190" height="197" border="0" align="right" alt="upload.jpg" title="upload.jpg" class="noborder" src="value4.jpg" />
  <li><a href="http://www.verot.net/pretty/">Electronaut Records</a></li>      
  <img src="value5.jpg" />
  <li><a target="_new" href="http://www.catseye-crew.com">Catseye Productions</a></li>     
  <img width="190" height="197" border="0" align="right" alt="upload.jpg" title="upload.jpg" class="noborder" src="value6.jpg" />
';   
preg_match_all('/<img .*src=["|\']([^"|\']+)/i', $html, $matches);
foreach ($matches[1] as $key=>$value) {
    echo $value."<br>";
} 

Вывод:

value1.jpg
value2.jpg
value3.jpg
res/upload.jpg
value4.jpg
value5.jpg
value6.jpg

Ответ 3

Это работает для меня:

preg_match('@<img.+src="(.*)".*>@Uims', $html, $matches);
$src = $matches[1];

Ответ 4

Я предполагаю, что все ваши src= have "вокруг url

<img[^>]+src=\"([^\"]+)\"

другие ответы, размещенные здесь, делают другие предположения о вашем коде

Ответ 5

Я согласен с Эндрю Муром. Использование DOM намного, намного лучше. Коллекция изображений HTML DOM вернет вам ссылку на все объекты изображения.

Скажем в вашем заголовке,

<script type="text/javascript">
    function getFirstImageSource()
    {
        var img = document.images[0].src;
        return img;
    }
</script>

а затем в вашем теле,

<script type="text/javascript">
  alert(getFirstImageSource());
</script>

Это вернет 1-й источник изображения. Вы также можете прокручивать их вдоль линий, (в разделе головы)

function getAllImageSources()
    {
        var returnString = "";
        for (var i = 0; i < document.images.length; i++)
        {
            returnString += document.images[i].src + "\n"
        }
        return returnString;
    }

(в теле)

<script type="text/javascript">
  alert(getAllImageSources());
</script>

Если вы используете JavaScript для этого, помните, что вы не можете запускать цикл вашей функции через коллекцию изображений в своем заголовке. Другими словами, вы не можете сделать что-то подобное,

<script type="text/javascript">
    function getFirstImageSource()
    {
        var img = document.images[0].src;
        return img;
    }
    window.onload = getFirstImageSource;  //bad function

</script>

потому что это не сработает. Изображения не загружаются, когда заголовок выполняется, и вы получите нулевой результат.

Надеюсь, это может помочь в некотором роде. Если возможно, я бы использовал DOM. Вы обнаружите, что значительная часть вашей работы уже сделана для вас.

Ответ 6

Я не знаю, хотите ли вы использовать регулярное выражение для получения результатов. Если нет, вы можете попробовать simpleXML и XPath, которые были бы намного более надежными для вашей цели:

Сначала импортируйте HTML в объект документа DOM. Если вы получаете ошибки, отключите ошибки для этой части и не забудьте снова включить их:

 $dom = new DOMDocument();
 $dom -> loadHTMLFile("filename.html");

Затем импортируйте DOM в объект simpleXML, например:

 $xml = simplexml_import_dom($dom);

Теперь вы можете использовать несколько методов, чтобы все элементы изображения (и их атрибуты) попадали в массив. XPath - это тот, который я предпочитаю, потому что мне повезло с обходом DOM с ним:

 $images = $xml -> xpath('//img/@src');

Эта переменная теперь может обрабатываться как массив ваших URL-адресов изображений:

 foreach($images as $image) {
    echo '<img src="$image" /><br />
    ';
  }

Престо, все ваши изображения, ни один жир.

Здесь не аннотированная версия выше:


 $dom = new DOMDocument();
 $dom -> loadHTMLFile("filename.html");

 $xml = simplexml_import_dom($dom);

 $images = $xml -> xpath('//img/@src');

 foreach($images as $image) {
    echo '<img src="$image" /><br />
    ';
  }

Ответ 7

Я действительно думаю, что вы не можете предсказать все случаи с регулярным выражением.

Лучший способ - использовать DOM с PHP5 класс DOMDocument и xpath. Это самый чистый способ сделать то, что вы хотите.

$dom = new DOMDocument();
$dom->loadHTML( $htmlContent );
$xml = simplexml_import_dom($dom);
$images = $xml -> xpath('//img/@src');

Ответ 8

Вы можете попробовать следующее:

preg_match_all("/<img\s+src=\"(.+)\"/i", $html, $matches);
foreach ($matches as $key=>$value) {
    echo $key . ", " . $value . "<br>";
}

Ответ 9

так как вы не беспокоитесь о проверке HTML, вы можете сначала попробовать strip_tags() вначале, чтобы очистить большую часть крутой.

Затем вы можете искать выражение типа

"/\<img .+ \/\>/i"

Обратные косые черты сбрасывают специальные символы, такие как <, > ,/. . + настаивает на наличии одного или нескольких символов внутри тега img. Вы можете захватить часть выражения, поместив вокруг нее круглые скобки. например (. +) фиксирует среднюю часть тега img.

Когда вы решаете, какую часть середины вы хотите захватить, вы можете изменить (. +) на что-то более конкретное.

Ответ 10

<?php    
/* PHP Simple HTML DOM Parser @ http://simplehtmldom.sourceforge.net */

require_once('simple_html_dom.php');

$html = file_get_html('http://example.com');
$image = $html->find('img')[0]->src;

echo "<img src='{$image}'/>"; // BOOM!

PHP Простой HTML DOM Parser выполнит работу в нескольких строках кода.