如何从PHP curl请求的API响应中提取rcmDriverAgesInfo等指定数据集
RentalCarManager租车API响应字段提取方案
原请求说明
你当前使用的curl请求如下:
curl 'https://apis.rentalcarmanager.com/booking/v3.1/API_KEY/step2/0/5/17_11_2021/11_00/5/23_11_2021/11_00/2/0/-/-?apikey=API_KEY' \ -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0' \ -H 'Accept: image/webp,*/*' \ -H 'Accept-Language: en-US,en;q=0.5' \ --compressed \ -H 'Connection: keep-alive' \ -H 'Cookie: PHPSESSID=dksko0e9vkcuggi7lk7o94eaq1' \ -H 'Pragma: no-cache' \ -H 'Cache-Control: no-cache' \ -H 'TE: Trailers'
原有PHP实现存在URL拼写错误,API_KEY后多了多余的等号,先修正后再执行字段提取逻辑。
核心提取逻辑实现
因为接口返回的是JS变量赋值格式的内容,我们可以通过正则匹配定位目标变量对应的数组内容,再转成PHP可用的数组格式,完整实现代码如下:
<?php $curl = curl_init(); // 替换为你实际的API_KEY $apiKey = '你的实际API_KEY'; $url = "https://apis.rentalcarmanager.com/booking/v3.1/{$apiKey}/step2/0/5/25_10_2021/11_00/5/30_10_2021/11_00/2/0/-/-?apikey={$apiKey}"; curl_setopt_array($curl, array( CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 30, CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_HTTPHEADER => array( 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0', 'Accept: image/webp,*/*', 'Accept-Language: en-US,en;q=0.5', 'Connection: keep-alive', 'Cookie: PHPSESSID=dksko0e9vkcuggi7lk7o94eaq1', 'Pragma: no-cache', 'Cache-Control: no-cache', ), )); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); if ($err) { die("请求错误:" . $err); } // 提取rcmDriverAgesInfo数据 preg_match('/rcmDriverAgesInfo\s*=\s*(.*?);/s', $response, $driverMatch); $rcmDriverAgesInfo = []; if (!empty($driverMatch[1])) { // 第二个参数为true表示返回数组而非对象 $rcmDriverAgesInfo = json_decode($driverMatch[1], true) ?: []; } // 提取rcmOfficeTimes数据 preg_match('/rcmOfficeTimes\s*=\s*(.*?);/s', $response, $officeMatch); $rcmOfficeTimes = []; if (!empty($officeMatch[1])) { $rcmOfficeTimes = json_decode($officeMatch[1], true) ?: []; } // 测试打印提取结果 print_r($rcmDriverAgesInfo); print_r($rcmOfficeTimes); ?>
实现说明
- 正则中的
s修饰符用于匹配换行,兼容返回内容中数组跨多行的场景 - 非贪婪匹配
.*?确保只匹配到当前变量赋值的第一个分号位置,不会误匹配后面其他变量的内容 - 如果返回的JS内容使用单引号包裹字符串,可以先把匹配到的内容里的单引号替换为双引号,再执行
json_decode即可
内容的提问来源于stack exchange,提问作者Abhi
相关产品推荐
相关产品推荐

