PHP urlencode - 仅对文件名进行编码,不要处理斜杠

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

问题在于urlencode也会对斜杠进行编码,导致URL无法使用。我该如何只对最后一个文件名进行编码?

4个回答

11

试一下:

$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处理。

1
在末尾缺少 ")" 的情况下完美运行 :) - Winston Smith
1
我会使用 rawurlencode 而不是 urlencode 来处理文件名。 - Emilio Bool
我们确定在问号后面的URL中不存在正斜杠吗?即使它不应该出现,从技术上讲,它应该被转义,但如果没有呢?例如:“https://example.com/thing?redirect=www.example.com/other-thing”。也许这并不重要,因为URL无效,但是否有解决方案可以正确编码整个字符串? - Joel M

7
首先,这里是为什么你应该使用rawurlencode而不是urlencode
回答你的问题,不要在一堆中寻找针头并冒险不对URL中的其他可能特殊字符进行编码,只需对整个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


0

从中提取文件名并对其进行转义。

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

$newFileName = urlencode($filename);

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

这是一个慢解决方案。无需将字符串转储到数组中。 - ducin

0
类似于 @Jeff Puckett 的答案,但作为一个使用数组替换的函数:
function urlencode_url($url) {
    return str_replace(['%3A','%2F'], [':', '/'], rawurlencode($url));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接