Используя регулярные выражения для извлечения первого источника изображения из html-кодов?
Я хотел бы знать, как это может быть достигнуто.
Предположим, что существует много html-кода, содержащего таблицы, divs, изображения и т.д.
Проблема. Как получить совпадения всех событий. Более того, чтобы быть конкретным, как я могу получить источник тега img (src=?).
Пример:
<img src="http://example.com/g.jpg" alt="" />
Как я могу распечатать http://example.com/g.jpg в этом случае. Я хочу предположить, что есть и другие теги в html-коде, как я упоминал, и, возможно, несколько изображений. Можно ли иметь массив всех источников изображений в html-коде?
Я знаю, что это может быть достигнуто так или иначе с помощью регулярных выражений, но я не могу понять его.
Любая помощь очень ценится.
Ответы
Ответ 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 выполнит работу в нескольких строках кода.