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

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

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

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

пример:

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

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

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

Любая помощь приветствуется.

Хотя регулярные выражения могут быть полезны для большого числа задач, я считаю, что это обычно не подходит при анализе 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.


EDIT: Если вы хотите все изображения:

 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; } 

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

 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 

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

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

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

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

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

Я согласен с Эндрю Муром. Использование 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. Вы обнаружите, что большая часть вашей работы уже сделана для вас.

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

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

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

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

  $xml = simplexml_import_dom($dom); 

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

  $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 /> '; } 

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

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

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

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

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

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

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

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

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

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

 <?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 будет выполнять работу в нескольких строках кода.