2012-04-12 15 views
43

würde ich gerne das SRK in eine Variable Attribut in diesem Beispiel erhalten:Get img src mit PHP

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

So zum Beispiel - ich mag eine Variable $foo = "/images/image.jpg" erhalten. Wichtig! Das src-Attribut wird dynamisch sein, also muss es nicht hardcoded sein. Gibt es eine schnelle und einfache Möglichkeit, dies zu tun?

Danke!

EDIT: Das Bild wird Teil einer großen Zeichenfolge, die im Grunde der Inhalt einer Nachrichtengeschichte ist. Also ist das Bild nur ein Teil davon.

EDIT2: Es wird mehr Bilder in dieser Zeichenfolge geben, und ich möchte nur die Quelle des ersten erhalten. Ist das möglich?

+0

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

Antwort

84

Verwenden Sie einen HTML-Parser wie DOMDocument und dann den Wert beurteilen Sie für mit DOMXpath suchen:

$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" 

Oder für diejenigen, die wirklich Platz sparen müssen:

Und für den Einzeiler gibt:

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

Brilliant One-Liner! – ArcticanAudio

+0

Excellent Dude ... – chhameed

+0

Dies scheint ein Bild zu bekommen. Wie auch immer, um alle Bilder in HTML zu bekommen? –

8

Ich weiß, Leute sagen, dass Sie keine regulären Ausdrücke verwenden sollten, um HTML zu analysieren, aber in diesem Fall finde ich es vollkommen in Ordnung.

$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

Das Problem ist, dass diese Regex spezifisch für diese Variable ist . Was, wenn Sie die 'src' von einem anderen Bild bekommen wollten? –

+0

@Rocket Der obige Regex ist nicht spezifisch für diese Variable. Dies funktioniert mit allen (ich glaube) 'img' -Tags, die ein 'src'-Attribut haben. – kba

+0

Ich nehme es zurück, das sollte gut funktionieren. –

19

Sie wäre besser dran, einen DOM-Parser für diese Art von HTML-Analyse verwendet wird. Betrachten Sie diesen Code:

$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 

OUTPUT:

src=/images/image.jpg 
+1

Für eine umfassendere HTML-Analyse stimme ich völlig zu, aber dafür ist es einfach übertrieben: Ihr Code ist länger, langsamer und schwerer zu lesen. – kba

+1

@KristianAntonsen: Es ist auch richtig. –

+0

@KristianAntonsen: Wie kannst du sagen, dass dieser Code 'langsamer' ist als Regex? Haben Sie Benchmarks, um dieses Verhalten zu unterstützen? – anubhava

-1

Es konnten zwei einfache Lösungen sein:

  1. HTML selbst ist ein xml so Sie jede XML-Parsing-Methode verwenden können wenn du das Tag als XML lädst und sein Attribut totally dynamisch erhältst, sogar dom Datenattribut (wie Datenzeit oder irgendetwas) .....
  2. Verwenden Sie einen beliebigen HTML-Parser für PHP wie http://mbe.ro/2009/06/21/php-html-to-array-working-one/ oder PHP Parse html Array 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; 

Andere regexp die verwendet werden, um festzustellen, ob der gezogene src-Tag ein Bild wie so ist:

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

'[jpg] {3}' passt zu 'jpg',' jgp', 'gjp' etc ... Das gleiche gilt für den Rest – HamZa

13

I Ich habe das einfacher gemacht, nicht so sauber, wie es sein sollte, aber es war ein schneller Hack

$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

Was ist, wenn die HTML-Zeichenfolge ein Bild in einem Kommentar enthält? Die Verwendung eines echten HTML-Parsers ist hier der einzige Weg zur Korrektheit. –

+0

Dies funktionierte gut für mich auf fehlerhafte HTML-Fragmente. – 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


HINWEIS: Sie sollten einen HTML-Parser wie DOMDocument und NICHT eine Regex verwenden.