将PHP中的字符串转换为文件名…而不剥离特殊字符

将PHP中的字符串转换为文件名…而不剥离特殊字符,php,string,url,Php,String,Url,我们当前的系统保存与其父组名称匹配的文件。因此,一个名为“My Devices”的组保存了一个名为“My+Devices.jpg”的图像。这非常有效,尽管在PHP和JS中将名称转换为“My%20Devices.jpg”时遇到了一些麻烦,但在此之前,我只能将空格转换为加号 现在我们需要考虑其他特殊字符,比如撇号,这样一个组就可以命名为“Joe’s Devices”。我需要一些方法将其转换为可以是文件名的内容。但我不能只去掉特殊字符,否则如果有人使用“Joes Devices”组名(不带撇号),可能

我们当前的系统保存与其父组名称匹配的文件。因此,一个名为“My Devices”的组保存了一个名为“My+Devices.jpg”的图像。这非常有效,尽管在PHP和JS中将名称转换为“My%20Devices.jpg”时遇到了一些麻烦,但在此之前,我只能将空格转换为加号

现在我们需要考虑其他特殊字符,比如撇号,这样一个组就可以命名为“Joe’s Devices”。我需要一些方法将其转换为可以是文件名的内容。但我不能只去掉特殊字符,否则如果有人使用“Joes Devices”组名(不带撇号),可能会发生冲突

我尝试了urlencode()和rawurlencode(),但它们都使用百分号,这对URL很有用,但对文件名就没那么多了。我认为base64_encode()会更好,即使它是一个更长的字符串。但它包含对文件名不利的等号


有没有一种方法可以将字符串转换为文件名友好的字符串,即可以解码回原始字符串的字符串?或者我需要完全重新编码此功能并使用ID匹配或其他什么吗?

假设您有一个名为“我的设备”的组。然后,使用md5对其名称进行散列,以将其保存在数据库或其他文件中:

$group = 'My Device';
$filename = md5($group) . '.png';
要显示或使用它,只需将组名再次散列到任意位置:

<?php
$group = 'My Device';
$filename = md5($group) . '.png';
?>
<img src="<?php print $filename; ?>" />

" />

您的任务与创建url安全的base64编码字符串的问题非常相似

有关一个示例,请参见此答案:

我的解决方案是这个的一个变体

在我的一个应用程序中,我有一个包装器功能:

function base64_safe_encode($input, $stripPadding = false)
{
    $encoded = strtr(base64_encode($input), '+/=', '-_~');

    return ($stripPadding) ? str_replace("~","",$encoded) : $encoded;
}
现在,您可以生成一个文件名或url安全的base64编码字符串,该字符串很容易可逆

注意,如果您愿意,可以选择在字符串末尾去掉填充,PHP不要求在解码时出现填充字符

解码功能非常简单:

function base64_safe_decode($input)
{
    return base64_decode(strtr($input, '-_~', '+/='));
}

你能解释一下“家长组”是什么意思吗“?您可以md5文件名,这样文件名中就不会有任何空格或特殊字符。请记住,即使这种情况不太可能发生,你仍然可能会遇到碰撞。这只是一个家庭中WiFi上的一组设备。但它可能是一组任何东西,这只是意味着我必须将文件命名为与任意组名相同的名称。哦,看起来我无法对MD5进行反编码…如果我没有弄错的话,base64总是以等号结尾,因此您可以使用base64_编码,然后去掉结尾的等号。但是当你解码时,在解码前加上尾随的等号,但是给定哈希值,你不能得到
我的设备
是OP的重点。我现在明白了。但是为什么不把我的设备保存在数据库或文本文件中,这样他就可以根据“ID”来处理这个值,也许还可以用它来保存散列呢?至少在文件名中不必有奇怪的符号是一个解决办法。我正在尝试使这个修复尽可能小,如果可以的话,不必重新编写最初是如何完成的。但如果我真的要重构这个,这是个好主意。另一种方法可能是(即使我认为它不太可行)将字符转换成ASCII值,然后像12_34_45_12那样保存。你可以很容易地把它们分开,然后“解码”回来。