Regex & PHP – изолировать атрибут src от тега img

С 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" />'; 

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

Код

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

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

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

Предполагая, что существует только один img: P

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

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

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

preg_match прекрасно решает эту проблему.

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

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

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

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


 функция 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 = "тестовое изображение" src = "http://example.com/img/image.jpg" alt = "тестовое изображение" width = "100" height = "100" /> ';
$ img_src = getTextBetween ('src = "', '' ', $ foo);

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

 $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 

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