正则表达式提取图像链接

时间:2013-07-24 10:21:59

标签: php regex preg-replace

我正在阅读HTML内容。有图像标签,如

<img onclick="document.location='http://abc.com'" src="http://a.com/e.jpg" onload="javascript:if(this.width>250) this.width=250">

<img src="http://a.com/e.jpg" onclick="document.location='http://abc.com'" onload="javascript:if(this.width>250) this.width=250" />

我尝试将此标记重新格式化为

<img src="http://a.com/e.jpg" />

但是我不成功。我到目前为止尝试构建的代码就像

$image=preg_replace('/<img(.*?)(\/)?>/','',$image);

任何人都可以提供帮助吗?

2 个答案:

答案 0 :(得分:1)

这是一个使用DOMDocument的版本,它删除<img>标记以外的所有属性,src属性除外。请注意,使用DOMDocument执行loadHTMLsaveHTML也可以更改其他html,尤其是在html格式不正确的情况下。所以要小心 - 测试并看看结果是否可以接受。

<?php

$html = <<<ENDHTML
<!doctype html>
<html><body>
<a href="#"><img onclick="..." src="http://a.com/e.jpg" onload="..."></a>

<div><p>
<img src="http://a.com/e.jpg" onclick="..." onload="..." />
</p></div>
</body></html>
ENDHTML;

$dom = new DOMDocument;
if (!$dom->loadHTML($html)) {
    throw new Exception('could not load html');
}

$xpath = new DOMXPath($dom);

foreach ($xpath->query('//img') as $img) {
    // unfortunately, cannot removeAttribute() directly inside
    // the loop, as this breaks the attributes iterator.
    $remove = array();
    foreach ($img->attributes as $attr) {
        if (strcasecmp($attr->name, 'src') != 0) {
            $remove[] = $attr->name;
        }
    }

    foreach ($remove as $attr) {
        $img->removeAttribute($attr);
    }
}

echo $dom->saveHTML();

答案 1 :(得分:0)

一次匹配一个然后连接字符串,我不确定你正在使用哪种语言如此错误地解释伪:

1.Find <img with regex place match in a string variable
2.Find src="..." with src=".*?" place match in a string variable
3.Find the end /> with \/> place match in a string variable
4.Concat the variables together