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

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

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

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

пример:

 

Как я могу распечатать http://example.com/g.jpg в этом случае. Я хочу предположить, что есть и другие tags в 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 или наоборот, и преодоление этого ограничения добавит сложности к регулярному выражению.

Также рассмотрим следующее. Чтобы правильно сопоставить с помощью регулярных выражений и получить только атрибут 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'); https://stackoverflow.com/questions/1196570/using-regular-expressions-to-extract-the-first-image-source-from-html-codes/$images = array(); foreach($img_tags as https://stackoverflow.com/questions/1196570/using-regular-expressions-to-extract-the-first-image-source-from-html-codes/$image) { https://stackoverflow.com/questions/1196570/using-regular-expressions-to-extract-the-first-image-source-from-html-codes/$images[] = https://stackoverflow.com/questions/1196570/using-regular-expressions-to-extract-the-first-image-source-from-html-codes/$image->src; } return https://stackoverflow.com/questions/1196570/using-regular-expressions-to-extract-the-first-image-source-from-html-codes/$images; } 

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

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

Пример:

 $html = '  upload.jpg 
  • Man from Uranus
  • The Vichy Government
  • Cambridge Poetry
  • upload.jpg
  • Electronaut Records
  • Catseye Productions
  • upload.jpg '; preg_match_all('/$value) { echo $value."
    "; }

    Вывод:

     https://stackoverflow.com/questions/1196570/using-regular-expressions-to-extract-the-first-image-source-from-html-codes/value1.jpg https://stackoverflow.com/questions/1196570/using-regular-expressions-to-extract-the-first-image-source-from-html-codes/value2.jpg https://stackoverflow.com/questions/1196570/using-regular-expressions-to-extract-the-first-image-source-from-html-codes/value3.jpg https://stackoverflow.com/questions/1196570/using-regular-expressions-to-extract-the-first-image-source-from-html-codes/res/upload.jpg https://stackoverflow.com/questions/1196570/using-regular-expressions-to-extract-the-first-image-source-from-html-codes/value4.jpg https://stackoverflow.com/questions/1196570/using-regular-expressions-to-extract-the-first-image-source-from-html-codes/value5.jpg https://stackoverflow.com/questions/1196570/using-regular-expressions-to-extract-the-first-image-source-from-html-codes/value6.jpg 

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

     preg_match('@@Uims', $html, $matches); $src = $matches[1]; 

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

     ]+src=\"([^\"]+)\" 

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

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

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

      

    и тогда в вашем теле у вас есть,

      

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

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

    (в теле)

      

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

      

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

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

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

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

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

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

      $xml = simplexml_import_dom($dom); 

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

      https://stackoverflow.com/questions/1196570/using-regular-expressions-to-extract-the-first-image-source-from-html-codes/$images = $xml -> xpath('//img/@src'); 

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

      foreach(https://stackoverflow.com/questions/1196570/using-regular-expressions-to-extract-the-first-image-source-from-html-codes/$images as https://stackoverflow.com/questions/1196570/using-regular-expressions-to-extract-the-first-image-source-from-html-codes/$image) { echo '
    '; }

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

    Ниже приведена не аннотированная версия:


      $dom = new DOMDocument(); $dom -> loadHTMLFile("filename.html"); $xml = simplexml_import_dom($dom); https://stackoverflow.com/questions/1196570/using-regular-expressions-to-extract-the-first-image-source-from-html-codes/$images = $xml -> xpath('//img/@src'); foreach(https://stackoverflow.com/questions/1196570/using-regular-expressions-to-extract-the-first-image-source-from-html-codes/$images as https://stackoverflow.com/questions/1196570/using-regular-expressions-to-extract-the-first-image-source-from-html-codes/$image) { echo '
    '; }

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

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

     $dom = new DOMDocument(); $dom->loadHTML( $htmlContent ); $xml = simplexml_import_dom($dom); https://stackoverflow.com/questions/1196570/using-regular-expressions-to-extract-the-first-image-source-from-html-codes/$images = $xml -> xpath('//img/@src'); 

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

     preg_match_all("/$value) { echo $key . ", " . $value . "
    "; }

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

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

     "/\/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'); https://stackoverflow.com/questions/1196570/using-regular-expressions-to-extract-the-first-image-source-from-html-codes/$image = $html->find('img')[0]->src; echo ""; // BOOM! 

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