Regex & PHP - изолировать атрибут src от тега img - PullRequest
34 голосов
/ 23 января 2010

Как с помощью 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" />';

Ответы [ 10 ]

70 голосов
/ 23 января 2010

Если вы не хотите использовать регулярные выражения (или любые нестандартные компоненты 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');
    }
?>
35 голосов
/ 23 января 2010

Код

<?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
7 голосов
/ 23 января 2010

Я получил этот код:

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

При условии, что есть только один img: P

7 голосов
/ 23 января 2010
// 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/

3 голосов
/ 11 июля 2015

Я очень опоздал на это, но у меня есть простое решение, еще не упомянутое. Загрузите его с simplexml_load_string (если у вас включен simplexml), а затем пролистайте его через json_encode и 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 приходит как

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_encode и json_decode, как это, будет медленнее, чем больше ввод) Он запутанный, но на сегодняшний день это самый простой способ чтения свойств HTML.

1 голос
/ 28 сентября 2010

preg_match хорошо решает эту проблему.

Смотрите мой ответ здесь: Как извлечь img src, title и alt из html с помощью php?

1 голос
/ 23 января 2010

Вот что я в итоге сделал, хотя я не уверен, насколько это эффективно:

$imgsplit = explode('"',$data);
foreach ($imgsplit as $item) {
    if (strpos($item, 'http') !== FALSE) {
        $image = $item;
        break;
    }
}
1 голос
/ 23 января 2010

попробуйте этот шаблон:

'/< \s* img [^\>]* src \s* = \s* [\""\']? ( [^\""\'\s>]* )/'
0 голосов
/ 01 августа 2016

давайте предположим, что я использую

$text ='<img src="blabla.jpg" alt="blabla" />';

в

getTextBetween('src="','"',$text);

коды вернутся:

blabla.jpg" alt="blabla" 

что неверно, мы хотим, чтобы коды возвращали текст между кавычками значения атрибута, т.е. attr = "value".

так

  function getTextBetween($start, $end, $text)
            {
                // explode the start string
                $first_strip= end(explode($start,$text,2));

                // explode the end string
                $final_strip = explode($end,$first_strip)[0];
                return $final_strip;
            }

делает свое дело!.

Попробуйте

   getTextBetween('src="','"',$text);

вернет:

blabla.jpg

Спасибо все равно, потому что ваше решение дало мне понимание окончательного решения.

0 голосов
/ 23 января 2010

Вы можете обойти эту проблему, используя эту функцию:


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;
}<br>
$foo = '<img class="foo bar test" title="test image" 
src="http://example.com/img/image.jpg" alt="test image"
width="100" height="100" />';<br>
$img_src = getTextBetween('src="', '"', $foo);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...