【问题标题】:Scrape unique image URLs from HTML从 HTML 中抓取唯一的图像 URL
【发布时间】:2011-03-31 22:40:16
【问题描述】:

使用 PHP 卷曲网页(用户输入的某些 URL,假设它是有效的)。 示例:http://www.youtube.com/watch?v=Hovbx6rvBaA

我需要解析 HTML 并提取所有看起来像图像的去重 URL。不仅是img src="" 中的那些,还包括该页面上以jpe?g|bmp|gif|png 等结尾的任何URL。 (换句话说,我不想解析 DOM,但想使用 RegEx)。

然后我计划卷曲 URL 以获取它们的宽度和高度信息,并确保它们确实是图像,所以不要担心与安全相关的东西。

【问题讨论】:

  • 使用 DOM 解析器有什么问题?
  • 您在这里寻求什么帮助?

标签: php regex deduplication


【解决方案1】:

使用 DOM 有什么问题?它使您可以更好地控制信息的上下文,并且您提取的内容实际上是 URL 的可能性更高。

<?php
$resultFromCurl = '
    <html>
    <body>
    <img src="hello.jpg" />
    <a href="yep.jpg">Yep</a>
    <table background="yep.jpg">
    </table>
    <p>
        Perhaps you should check out foo.jpg! I promise it 
        is safe for work.
    </p>
    </body>
    </html>
';

// these are all the attributes i could think of that
// can contain URLs.
$queries = array(
    '//table/@background',
    '//img/@src',
    '//input/@src',
    '//a/@href',
    '//area/@href',
    '//img/@longdesc',
);

$dom = @DOMDocument::loadHtml($resultFromCurl);
$xpath = new DOMXPath($dom);

$urls = array();
foreach ($queries as $query) {
    foreach ($xpath->query($query) as $link) {
        if (preg_match('@\.(gif|jpe?g|png)$@', $link->textContent))
            $urls[$link->textContent] = true;
    }
}

if (preg_match_all('@\b[^\s]+\.(?:gif|jpe?g|png)\b@', $dom->textContent, $matches)) {
    foreach ($matches as $m) {
        $urls[$m[0]] = true;
    }
}

$urls = array_keys($urls);
var_dump($urls);

【讨论】:

  • 出现在属性之外的文本中的 URL 怎么办?
  • 我已将其添加到答案中。
【解决方案2】:

将所有图片 url 收集到一个数组中,然后使用array_unique() 删除重复项。

$my_image_links = array_unique( $my_image_links );
// No more duplicates

如果您真的想使用正则表达式执行此操作,那么我们可以假设每个图像名称将被 '" 或空格、制表符、换行符或行首包围,@987654326 @、&lt;,以及您能想到的任何其他内容。那么,我们可以这样做:

$pattern = '/[\'" >\t^]([^\'" \n\r\t]+\.(jpe?g|bmp|gif|png))[\'" <\n\r\t]/i';
preg_match_all($pattern, html_entity_decode($resultFromCurl), $matches);
$imgs = array_unique($matches[1]);

上面将捕获图像链接,例如:

<p>Hai guys look at this ==> http://blah.com/lolcats.JPEG</p>

Live example

【讨论】:

  • 使用集合结构而不添加欺骗会更合乎逻辑。
猜你喜欢
  • 1970-01-01
  • 2017-12-09
  • 2015-06-08
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 2017-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多