正则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; 

http://simplehtmldom.sourceforge.net/

我得到了这个代码:

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

假设只有一个img:P

我非常迟到,但我有一个简单的解决scheme还没有提到。 用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" } } 

我已经使用这个parsingXML和HTML几个月了,它工作得很好。 我没有打嗝,但我没有parsing一个大的文件(我想象使用json_encodejson_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。