正则expression式和PHP – 从img标签隔离src属性
用PHP,我怎样才能从$ foo中隔离src属性的内容? 我正在寻找的最终结果会给我只是“ 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" />';
如果您不希望使用正则expression式(或任何非标准的PHP组件),则使用内置DOMDocument类的合理解决scheme如下所示:
<?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;
我得到了这个代码:
$dom = new DOMDocument(); $dom->loadHTML($img); echo $dom->getElementsByTagName('img')->item(0)->getAttribute('src');
假设只有一个img:P
我非常迟到,但我有一个简单的解决scheme还没有提到。 用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" } }
我已经使用这个parsingXML和HTML几个月了,它工作得很好。 我没有打嗝,但我没有parsing一个大的文件(我想象使用json_encode
和json_decode
就会越慢input越大)。 这很复杂,但它是读取HTML属性最简单的方法。
试试这个模式:
'/< \s* img [^\>]* src \s* = \s* [\""\']? ( [^\""\'\s>]* )/'
preg_match
很好地解决了这个问题。
在这里看到我的答案: 如何从HTML提取img src,标题和ALT使用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); 返回$ subtext; }
$ foo ='<img class =“foo bar test”title =“testing图片” src =“http://example.com/img/image.jpg”alt =“testing图片” 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
非常感谢,因为您的解决scheme让我深入了解最终的解决scheme。