You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何更高效地从RETS返回的字符串数组中提取图片链接?

高效提取RETS查询返回的图片链接

我通过RETS(房地产交易标准)查询房产信息,返回的对象中包含了房屋图片的各类信息字符串(比如同一房屋的多张不同图片)。现在只需要提取每张图片对应Location:字段的链接,存入可在脚本其他地方使用的$picturelinks数组。

目前我用嵌套的explode()命令实现了需求,但想找更直接、高效的方法——比如直接删除"Location: "之前的所有内容,再删除".jpg"之后的所有内容,最终得到目标数组。

待处理的数据示例

Array (
    [1] => WhateverGibberish
    Content-Type: image/jpeg
    Content-ID: bunchofnumbers
    Object-ID: 1
    Location: http://cdn.photos.sparkplatform.com/met/347305719000000-o.jpg
    Content-Description: Welcome
    Preferred: 1
    
    [2] => WhateverGibberish
    Content-Type: image/jpeg
    Content-ID: bunchofnumbers
    Object-ID: 2
    Location: http://cdn.photos.sparkplatform.com/met/350148712000000-o.jpg
    Content-Description: Welcome home
    
    [3] => WhateverGibberish
    Content-Type: image/jpeg
    Content-ID: bunchofnumbers
    Object-ID: 3
    Location: http://cdn.photos.sparkplatform.com/met/351982042000000-o.jpg
    Content-Description: Brick

    [4] => WhateverGibberish
    Content-Type: image/jpeg
    Content-ID: bunchofnumbers
    Object-ID: 4
    Location: http://cdn.photos.sparkplatform.com/met/353549178000000-o.jpg
    Content-Description: Brix
)

现有实现代码

<?php
$photos = $rets->GetObject("Property", "HiRes", $sysid, "*", 1); //1 gets links
foreach($photos as $photo) { //array includes everything for all photos      
    unset ($photo['Success']); //not needed
    unset ($photo['Content-Type']); //not needed
    unset ($photo['Length']); //not needed
        
    $pile=explode('--',$photo['Data']);
    unset ($pile[0]);
    foreach ($pile as $blah) {
        $subpile=explode('Location: ',$blah);
        $picstuff[]=$subpile[1];
    }
    foreach($picstuff as $piclilnk) {
        $breakme=explode('Content-Description: ',$piclilnk);
        $linksonly[]=$breakme[0];
        $otherstuff[]=$breakme[1];
    }
    //print_r($linksonly);
    //print_r($otherstuff);
?>

更高效的实现方法

方法1:正则表达式(推荐,简洁高效)

利用正则直接匹配Location:后的链接,一次匹配即可获取目标内容,避免多次数组操作:

<?php
$photos = $rets->GetObject("Property", "HiRes", $sysid, "*", 1);
$picturelinks = [];

foreach ($photos as $photo) {
    // 匹配以Location: 开头的行,捕获http/https到.jpg的完整链接
    if (preg_match('/Location: (https?:\/\/.*?\.jpg)/i', $photo['Data'], $matches)) {
        $picturelinks[] = trim($matches[1]);
    }
}

// 查看结果
// print_r($picturelinks);
?>

说明:正则/Location: (https?:\/\/.*?\.jpg)/i中,https?:\/\/匹配http或https开头的链接,.*?是非贪婪匹配,确保只取到.jpg结尾的部分,i标记忽略大小写,适配可能的格式差异。

方法2:按行分割提取(可读性强,无需正则知识)

将每个图片的信息按行分割,遍历行找到Location:开头的行,直接提取链接:

<?php
$photos = $rets->GetObject("Property", "HiRes", $sysid, "*", 1);
$picturelinks = [];

foreach ($photos as $photo) {
    // 按换行分割所有行
    $lines = explode("\n", $photo['Data']);
    foreach ($lines as $line) {
        $line = trim($line);
        // 判断当前行是否以Location:开头
        if (strpos($line, 'Location:') === 0) {
            // 截取Location:后面的内容并去除首尾空格
            $link = trim(substr($line, strlen('Location:')));
            $picturelinks[] = $link;
            break; // 找到目标行后直接跳出循环,减少不必要的遍历
        }
    }
}

// 查看结果
// print_r($picturelinks);
?>

说明:如果使用PHP 8及以上版本,可以用str_starts_with($line, 'Location:')替代strpos($line, 'Location:') === 0,代码更直观。

对比优势

  • 原方法多次嵌套explode和unset,操作冗余,容易因格式变化出错
  • 正则方法:代码最简洁,执行效率最高,适合固定格式的文本提取场景
  • 按行分割方法:可读性强,无需正则基础,维护成本低

内容的提问来源于stack exchange,提问作者phc_joe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 16:21:05