使用正则表达式从html代码中提取第一个图像源?

Ahm*_*uad 20 html php regex

我想知道如何实现这一目标.

假设:有很多包含表格,div,图像等的html代码.

问题:如何获得所有出现的匹配.更重要的是,具体来说,我如何获得img标记源(src =?).

例:

<img src="http://example.com/g.jpg" alt="" />
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如何打印http://example.com/g.jpg.我想假设在我提到的html代码中还有其他标签,可能还有多个图像.是否有可能在html代码中拥有所有图像源的数组?

我知道这可以通过正则表达式实现,但我无法理解它.

任何帮助是极大的赞赏.

And*_*ore 40

虽然正则表达式可以适用于各种各样的任务,但我发现在解析HTML DOM时通常会出现问题.HTML的问题在于,文档的结构变化很大,难以准确(并且准确地说,我的意思是100%的成功率,没有误报)提取标签.

我建议你做的是使用DOM解析器,如下所示SimpleHTML:

function get_first_image($html) {
    require_once('SimpleHTML.class.php')

    $post_html = str_get_html($html);

    $first_img = $post_html->find('img', 0);

    if($first_img !== null) {
        return $first_img->src;
    }

    return null;
}
Run Code Online (Sandbox Code Playgroud)

有些人可能认为这样做太过分了,但最终,维护起来会更容易,并且可以提供更多的可扩展性.例如,使用DOM解析器,我也可以获取alt属性.

可以设计正则表达式以实现相同的目标,但是将限制它将强制alt属性src在相反或相反之后,并且克服该限制将增加正则表达式的更多复杂性.

另外,请考虑以下内容.要<img>使用正则表达式正确匹配标记并仅获取src属性(在组2中捕获),您需要以下正则表达式:

<\s*?img\s+[^>]*?\s*src\s*=\s*(["'])((\\?+.)*?)\1[^>]*?>
Run Code Online (Sandbox Code Playgroud)

如果出现以下情况,上述情况可能会失败:

  • 属性或标记名称为大写,并且i不使用修饰符.
  • src属性周围不使用引号.
  • 然后另一个属性在其值的某处src使用该>字符.
  • 我没有预料到的其他一些原因.

因此,再次,不要使用正则表达式来解析dom文档.


编辑:如果你想要所有的图像:

function get_images($html){
    require_once('SimpleHTML.class.php')

    $post_dom = str_get_dom($html);

    $img_tags = $post_dom->find('img');

    $images = array();

    foreach($img_tags as $image) {
        $images[] = $image->src;
    }

    return $images;
}
Run Code Online (Sandbox Code Playgroud)

  • **@ Ahmad Fouad:**正确,使用DOM Parser将无论属性顺序和大小写都可以工作. (2认同)

ina*_*abt 12

使用这个,更有效:

preg_match_all('/<img [^>]*src=["|\']([^"|\']+)/i', $html, $matches);
foreach ($matches[1] as $key=>$value) {
    echo $value."<br>";
}
Run Code Online (Sandbox Code Playgroud)

例:

$html = '
<ul>     
  <li><a target="_new" href="http://www.manfromuranus.com">Man from Uranus</a></li>       
  <li><a target="_new" href="http://www.thevichygovernment.com/">The Vichy Government</a></li>      
  <li><a target="_new" href="http://www.cambridgepoetry.org/">Cambridge Poetry</a></li>      
  <img width="190" height="197" border="0" align="right" alt="upload.jpg" title="upload.jpg" class="noborder" src="value1.jpg" />
  <li><a href="http://www.verot.net/pretty/">Electronaut Records</a></li>      
  <img width="190" height="197" border="0" align="right" alt="upload.jpg" title="upload.jpg" class="noborder" src="value2.jpg" />
  <li><a target="_new" href="http://www.catseye-crew.com">Catseye Productions</a></li>     
  <img width="190" height="197" border="0" align="right" alt="upload.jpg" title="upload.jpg" class="noborder" src="value3.jpg" />
</ul>
<img width="190" height="197" border="0" align="right" alt="upload.jpg" title="upload.jpg" class="noborder" src="res/upload.jpg" />
  <li><a target="_new" href="http://www.manfromuranus.com">Man from Uranus</a></li>       
  <li><a target="_new" href="http://www.thevichygovernment.com/">The Vichy Government</a></li>      
  <li><a target="_new" href="http://www.cambridgepoetry.org/">Cambridge Poetry</a></li>      
  <img width="190" height="197" border="0" align="right" alt="upload.jpg" title="upload.jpg" class="noborder" src="value4.jpg" />
  <li><a href="http://www.verot.net/pretty/">Electronaut Records</a></li>      
  <img src="value5.jpg" />
  <li><a target="_new" href="http://www.catseye-crew.com">Catseye Productions</a></li>     
  <img width="190" height="197" border="0" align="right" alt="upload.jpg" title="upload.jpg" class="noborder" src="value6.jpg" />
';   
preg_match_all('/<img .*src=["|\']([^"|\']+)/i', $html, $matches);
foreach ($matches[1] as $key=>$value) {
    echo $value."<br>";
} 
Run Code Online (Sandbox Code Playgroud)

输出:

value1.jpg
value2.jpg
value3.jpg
res/upload.jpg
value4.jpg
value5.jpg
value6.jpg
Run Code Online (Sandbox Code Playgroud)


cee*_*yoz 7

这对我有用:

preg_match('@<img.+src="(.*)".*>@Uims', $html, $matches);
$src = $matches[1];
Run Code Online (Sandbox Code Playgroud)


Nir*_*evy 5

我假设你的所有src =都有"围绕网址

<img[^>]+src=\"([^\"]+)\"
Run Code Online (Sandbox Code Playgroud)

这里发布的其他答案会对您的代码做出其他的答案