2012-04-12 2 views
43

Я хотел бы получить атрибут SRC в переменную в данном примере:Получить IMG SRC с PHP

<img border="0" src="/images/image.jpg" alt="Image" width="100" height="100" /> 

Так, например, - я хотел бы получить переменную $foo = "/images/image.jpg". Важно! Атрибут src будет динамическим, поэтому он не должен быть жестко запрограммирован. Есть ли какой-нибудь быстрый и простой способ сделать это?

Спасибо!

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

EDIT2: в этой строке будет больше изображений, и я бы хотел получить только src первого. Это возможно?

+0

http://stackoverflow.com/questions/138313/how-to-extract-img-src-title-and-alt-from-html-using-php – kpotehin

ответ

84

Используйте HTML-парсер, как DOMDocument, а затем оценить значение, которое вы ищете с DOMXpath:

$html = '<img id="12" border="0" src="/images/image.jpg" 
     alt="Image" width="100" height="100" />'; 

$doc = new DOMDocument(); 
$doc->loadHTML($html); 
$xpath = new DOMXPath($doc); 
$src = $xpath->evaluate("string(//img/@src)"); # "/images/image.jpg" 

Или для тех, кому действительно нужно сэкономить место:

$xpath = new DOMXPath(@DOMDocument::loadHTML($html)); 
$src = $xpath->evaluate("string(//img/@src)"); 

А для однострочных там:

$src = (string) reset(simplexml_import_dom(DOMDocument::loadHTML($html))->xpath("//img/@src")); 
+2

Блестящий лайнер! – ArcticanAudio

+0

Отличный чувак ... – chhameed

+0

Кажется, это одно изображение. В любом случае, чтобы получить все изображения в HTML? –

8

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

$string = '<img border="0" src="/images/image.jpg" alt="Image" width="100" height="100" />'; 
preg_match('/<img(.*)src(.*)=(.*)"(.*)"/U', $string, $result); 
$foo = array_pop($result); 
+0

Проблема в том, что это регулярное выражение относится к этой переменной , Что делать, если вы хотите получить 'src' с другого изображения? –

+0

@Rocket Регулярное выражение выше не относится к этой переменной. Это будет работать со всеми (я считаю) тегами 'img', которые имеют атрибут' src'. – kba

+0

Я возвращаю его, это должно работать нормально. –

19

Вам будет лучше использовать парсер DOM для такого разбора HTML-анализа. Рассмотрим этот код:

$html = '<img id="12" border="0" src="/images/image.jpg" 
     alt="Image" width="100" height="100" />'; 
$doc = new DOMDocument(); 
libxml_use_internal_errors(true); 
$doc->loadHTML($html); // loads your html 
$xpath = new DOMXPath($doc); 
$nodelist = $xpath->query("//img"); // find your image 
$node = $nodelist->item(0); // gets the 1st image 
$value = $node->attributes->getNamedItem('src')->nodeValue; 
echo "src=$value\n"; // prints src of image 

ВЫВОД:

src=/images/image.jpg 
+1

Для более подробного разбора HTML я полностью согласен, но для этого это просто излишне. Ваш код длиннее, медленнее и труднее читать. – kba

+1

@ KristianAntonsen: Это тоже правильно. –

+0

@KristianAntonsen: Как вы можете сказать, что этот код «медленнее», чем регулярное выражение? У вас есть бенчмаркинг, чтобы поддержать это поведение? – anubhava

-1

Там может быть два простых решения:

  1. HTML это сам является XML так вы можете использовать любой метод XML разбора если u загружает тег как XML и получает его атрибут tottally динамически даже атрибут dom data (например, время данных или что-то еще) .....
  2. Используйте любой HTML Parser для PHP как http://mbe.ro/2009/06/21/php-html-to-array-working-one/ или PHP разбора HTML в массив Google this
3
$str = '<img border="0" src=\'/images/image.jpg\' alt="Image" width="100" height="100"/>'; 

preg_match('/(src=["\'](.*?)["\'])/', $str, $match); //find src="X" or src='X' 
$split = preg_split('/["\']/', $match[0]); // split by quotes 

$src = $split[1]; // X between quotes 

echo $src; 

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

if(preg_match('/([jpg]{3}$)|([gif]{3}$)|([jpeg]{3}$)|([bmp]{3}$)|([png]{3}$)/', $src) == 1) { 
//its an image 
} 
+0

'[jpg] {3}' будет соответствовать 'jpg',' jgp', 'gjp' и т. Д. То же самое относится к остальным – HamZa

13

I сделали это более простым способом, не таким чистым, как это должно быть, но это был быстрый взлом

$htmlContent = file_get_contents('pageURL'); 

// read all image tags into an array 
preg_match_all('/<img[^>]+>/i',$htmlContent, $imgTags); 

for ($i = 0; $i < count($imgTags[0]); $i++) { 
    // get the source string 
    preg_match('/src="([^"]+)/i',$imgTags[0][$i], $imgage); 

    // remove opening 'src=' tag, can`t get the regex right 
    $origImageSrc[] = str_ireplace('src="', '', $imgage[0]); 
} 
// will output all your img src's within the html string 
print_r($origImageSrc); 
+3

Что делать, если строка HTML содержит изображение в комментарии? Использование реального парсера HTML - единственный путь к правильности здесь. –

+0

Это работало хорошо для меня на искаженных фрагментах html. – Corgalore

4
$imgTag = <<< LOB 
<img border="0" src="/images/image.jpg" alt="Image" width="100" height="100" /> 
<img border="0" src="/images/not_match_image.jpg" alt="Image" width="100" height="100" /> 
LOB; 

preg_match('%<img.*?src=["\'](.*?)["\'].*?/>%i', $imgTag, $matches); 
$imgSrc = $matches[1]; 

DEMO


ПРИМЕЧАНИЕ: Вы должны использовать HTML Parser как DOMDocument и НЕ регулярное выражение.