я вообще не понимаю почему не работает регулярка
Есть курл запрос на получение файла .mp3 в курле стоит настройка на получение заголовков
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($output, 0, $header_size);
$body = substr($output, $header_size);
в $header если сделать вардамп выводится следующее
string(324) "HTTP/1.1 200 OK Date: Tue, 11 Dec 2018 10:27:40 GMT Server: Apache X-Powered-By: PHP/5.6.28-pl0-gentoo Content-Length: 51408 Cache-Control: public Content-Transfer-Encoding: Binary Content-Disposition: attachment; filename=2018.12.07_[14:28:30]_+74562697525_103.mp3 Accept-Ranges: bytes Content-Type: audio/mpeg "
здесь я разделю заголовок от тела, далее с заголовком я вытаскиваю имя скаченного файла регуляркой и тут самое инетерсное
preg_replace('~^.+Content-Disposition: attachment; filename=(.+)Accept-Ranges.+$~i','$1',$header)
ожидаю увидеть
2018.12.07_[14:28:30]_+74562697525_103.mp3
а получаю вот это
HTTP/1.1 200 OK Date: Tue, 11 Dec 2018 10:27:40 GMT Server: Apache X-Powered-By: PHP/5.6.28-pl0-gentoo Content-Length: 51408 Cache-Control: public Content-Transfer-Encoding: Binary Content-Disposition: attachment; filename=2018.12.07_[14:28:30]_+74562697525_103.mp3 Accept-Ranges: bytes Content-Type: audio/mpeg
причем если тестировать на сервисе
https://www.bl2.ru/programing/regular.html то работает регулярка как надо
полный код функции
$ch = curl_init($link);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);
$output = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
curl_close($ch);
$date=date('Y_m_d');
if (!is_dir(call_dir . $date)) {
mkdir(call_dir . $date);
}
$header = substr($output, 0, $header_size);
$body = substr($output, $header_size);
var_dump($header);
$matches=array();
preg_match('~^.+Content-Disposition: attachment; filename=(.+)Accept-Ranges.+$~i',$header,$matches);
$header1=preg_replace('~^.+Content-Disposition: attachment; filename=(.+)Accept-Ranges.+$~i','$1',$header);
var_dump($matches);
var_dump($header1);
$fileName=md5(microtime(true)).'.mp3';
if ($status == 200){
file_put_contents(call_dir . $date . '/'.$fileName, $body);
}
полный пример кода функции выше