web-dev-qa-db-ja.com

正規表現&PHP-imgタグからsrc属性を分離

PHPで、src属性の内容を$ fooから分離するにはどうすればよいですか?私が探している最終結果は、「 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

正規表現(または非標準のPHPコンポーネント))を使用したくない場合、組み込みの DOMDocumentクラス を使用する合理的なソリューションは次のようになります。

<?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

コード

<?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] ) ;

出力

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

私はこのコードを手に入れました:

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

Imgが1つしかない場合: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

私はこれに非常に遅れていますが、まだ言及されていない簡単な解決策があります。 simplexml_load_string(simplexmlが有効になっている場合)でロードし、json_encodejson_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は次のようになります

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

私はこれを数か月間XMLとHTMLの解析に使用してきましたが、かなりうまく機能しています。大きなファイルを解析する必要はありませんでしたが、まだしゃっくりはありませんでした(そのようなjson_encodejson_decodeを使用すると、入力が大きくなると遅くなります)。複雑ですが、HTMLプロパティを読む最も簡単な方法です。

3
Josh Janusch

preg_matchはこの問題をうまく解決します。

ここで私の答えを参照してください: phpを使用してhtmlからimg src、title、altを抽出する方法?

1
WNRosenberg

このパターンを試してください:

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

これがどれだけ効率的かはわかりませんが、私がやったことは次のとおりです。

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

この機能を使用してこの問題を回避できます。

 
 function 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); 
 return $ 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);