Почему не работает preg_replace?

я вообще не понимаю почему не работает регулярка
Есть курл запрос на получение файла .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);
        }

полный пример кода функции выше
  • Вопрос задан
  • 132 просмотра
Решения вопроса 1
@dodo512
в $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 "

HTTP заголовки разделяются переводами строк. Сделай echo "<pre>", $header, "</pre>";
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

Без модификатора /s метасимвол точка совпадает со всеми символами, кроме переводов строк.
$header1=preg_replace('~^.+Content-Disposition: attachment; filename=(.+)Accept-Ranges.+$~is','$1',$header);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@vaajnur
битриксоид
банально результат ф-ии не присвоен переменной.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы