如何更高效地从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
相关产品推荐
相关产品推荐

