web-dev-qa-db-fra.com

Regex & PHP - isoler l'attribut src de la balise img

Avec PHP, comment puis-je isoler le contenu de l'attribut src de $ foo? Le résultat final que je recherche me donnerait juste " http://example.com/img/image.jpg "

$foo = '<img class="foo bar test" title="test image" src="http://example.com/img/image.jpg" alt="test image" width="100" height="100" />';
35
Jeff

Si vous ne souhaitez pas utiliser l'expression régulière (ou tout autre élément non standard PHP)), une solution raisonnable utilisant la fonction intégrée classe DOMDocument serait la suivante:

<?php
    $doc = new DOMDocument();
    $doc->loadHTML('<img src="http://example.com/img/image.jpg" ... />');
    $imageTags = $doc->getElementsByTagName('img');

    foreach($imageTags as $tag) {
        echo $tag->getAttribute('src');
    }
?>
70
John Parker

Code

<?php
    $foo = '<img class="foo bar test" title="test image" src="http://example.com/img/image.jpg" alt="test image" width="100" height="100" />';
    $array = array();
    preg_match( '/src="([^"]*)"/i', $foo, $array ) ;
    print_r( $array[1] ) ;

Production

http://example.com/img/image.jpg
35
St.Woland

J'ai ce code:

$dom = new DOMDocument();
$dom->loadHTML($img);
echo $dom->getElementsByTagName('img')->item(0)->getAttribute('src');

En supposant qu'il n'y a qu'une seule img: P

7
AntonioCS
// Create DOM from string
$html = str_get_html('<img class="foo bar test" title="test image" src="http://example.com/img/image.jpg" alt="test image" width="100" height="100" />');

// echo the src attribute
echo $html->find('img', 0)->src;

http://simplehtmldom.sourceforge.net/

7
karim79

Je suis extrêmement en retard, mais j'ai une solution simple non encore mentionnée. Chargez-le avec simplexml_load_string (si le simplexml est activé), puis feuilletez-le json_encode et json_decode.

$foo = '<img class="foo bar test" title="test image" src="http://example.com/img/image.jpg" alt="test image" width="100" height="100" />';

$parsedFoo = json_decode(json_encode(simplexml_load_string($foo)), true);
var_dump($parsedFoo['@attributes']['src']); // output: "http://example.com/img/image.jpg"

$parsedFoo apparaît comme

array(1) {
  ["@attributes"]=>
  array(6) {
    ["class"]=>
    string(12) "foo bar test"
    ["title"]=>
    string(10) "test image"
    ["src"]=>
    string(32) "http://example.com/img/image.jpg"
    ["alt"]=>
    string(10) "test image"
    ["width"]=>
    string(3) "100"
    ["height"]=>
    string(3) "100"
  }
}

J'utilise cela pour analyser XML et HTML depuis quelques mois maintenant et cela fonctionne plutôt bien. Je n'ai pas encore eu de hoquet, même si je n'ai pas eu à analyser un gros fichier avec lui (j'imagine utiliser json_encode et json_decode comme ça va ralentir à mesure que l'entrée augmente). C'est compliqué, mais c'est de loin le moyen le plus simple de lire les propriétés HTML.

3
Josh Janusch

preg_match résout bien ce problème.

Voir ma réponse ici: Comment extraire img src, title et alt de html en utilisant php?

1
WNRosenberg

essayez ce modèle:

'/< \s* img [^\>]* src \s* = \s* [\""\']? ( [^\""\'\s>]* )/'
1
user256058

Voici ce que j'ai fini par faire, bien que je ne sois pas sûr de son efficacité:

$imgsplit = explode('"',$data);
foreach ($imgsplit as $item) {
    if (strpos($item, 'http') !== FALSE) {
        $image = $item;
        break;
    }
}
1
Jeff

Vous pouvez contourner ce problème en utilisant cette fonction:

 
 fonction getTextBetween ($ start, $ end, $ text) 
 {
 $ start_from = strpos ($ text, $ start); 
 $ start_pos = $ start_from + strlen ($ start); 
 $ end_pos = strpos ($ text, $ end, $ start_pos + 1); 
 $ subtext = substr ($ text, $ start_pos, $ end_pos); 
 renvoie $ subtext; 
}
$ foo = '<img class = "foo bar test" title = "test image" src = "http://example.com/img/image.jpg" alt = "test image " width =" 100 "height =" 100 "/> ';
$ img_src = getTextBetween ('src = "', '"', $ foo);