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