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" />';
Ответы
Ответ 1
Если вы не хотите использовать регулярное выражение (или любые нестандартные 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');
}
?>
Ответ 2
Код
<?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
Ответ 3
// 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/
Ответ 4
Я получил этот код:
$dom = new DOMDocument();
$dom->loadHTML($img);
echo $dom->getElementsByTagName('img')->item(0)->getAttribute('src');
Предполагая, что существует только один img: P
Ответ 5
Я очень опаздываю на это, но у меня есть простое решение, которое еще не упоминалось. Загрузите его с помощью simplexml_load_string
(если у вас включен симплекс), а затем переверните его через 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.
Ответ 6
попробуйте этот шаблон:
'/< \s* img [^\>]* src \s* = \s* [\""\']? ( [^\""\'\s>]* )/'
Ответ 7
preg_match
хорошо решает эту проблему.
Посмотрите мой ответ здесь: Как извлечь img src, title и alt из html с помощью php?
Ответ 8
Вот что я сделал, хотя я не уверен, насколько это эффективно:
$imgsplit = explode('"',$data);
foreach ($imgsplit as $item) {
if (strpos($item, 'http') !== FALSE) {
$image = $item;
break;
}
}
Ответ 9
Вы можете обойти эту проблему, используя эту функцию:
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);
Ответ 10
позволяет предположить, что я использую
$text ='<img src="blabla.jpg" alt="blabla" />';
в
getTextBetween('src="','"',$text);
коды вернутся:
blabla.jpg" alt="blabla"
что неверно, мы хотим, чтобы коды возвращали текст между значениями значений атрибута i.e 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;
}
делает трюк!.
Try
getTextBetween('src="','"',$text);
вернется:
blabla.jpg
Спасибо всем тем же, потому что ваше решение дало мне представление о конечном решении.