PHP urlencode-кодирует только имя файла и не трогает косые черты

http://www.example.com/some_folder/some file [that] needs "to" be (encoded).zip
urlencode($myurl);

проблема в том, что urlencode также будет кодировать косые черты, что делает URL непригодным для использования. Как я могу закодировать только последнее имя файла ?

3 ответов


попробуйте это:

$str = 'http://www.example.com/some_folder/some file [that] needs "to" be (encoded).zip';
$pos = strrpos($str, '/') + 1;
$result = substr($str, 0, $pos) . urlencode(substr($str, $pos));

вы ищете последнее появление знака косой черты. До это нормально, так просто скопируй это. И urlencode остальные.


в первую очередь вот почему вы должны использовать rawurlencode вместо urlencode.

чтобы ответить на ваш вопрос, вместо того, чтобы искать иголку в стоге сена и рисковать не кодировать другие возможные специальные символы в вашем URL, просто Закодируйте все это, а затем исправьте косые черты (и двоеточие).

<?php
$myurl = 'http://www.example.com/some_folder/some file [that] needs "to" be (encoded).zip';
$myurl = rawurlencode($myurl);
$myurl = str_replace('%3A',':',str_replace('%2F','/',$myurl));

результаты в этом:

http://www.example.com/some_folder/some%20file%20%5Bthat%5D%20needs%20%22to%22%20be%20%28encoded%29.zip


вытащить имя файла и избежать его.

$temp = explode('/', $myurl);
$filename = array_pop($temp);

$newFileName = urlencode($filename);

$myNewUrl = implode('/', array_push($newFileName));