在PHP中转换字符串以用作文件名...而不剥离特殊字符

时间:2016-10-06 20:21:15

标签: php string url

我们当前的系统会保存与其父组名称相匹配的文件。因此,名为“我的设备”的组保存了一个名为“My + Devices.jpg”的图像。这很好用,即使在PHP和JS的某个地方将名称转换为“My%20Devices.jpg”时出现了一些问题,我还是可以在发生这种情况之前将空格转换为加号。

现在我们需要考虑其他特殊字符,例如撇号,以便将一个组命名为“Joe's Devices”。我需要一些方法将其转换为可以是文件名的东西。但我不能只删除特殊字符,如果有人使用组名“Joes Devices”(没有撇号),可能会发生碰撞。

我尝试过urlencode()和rawurlencode(),但是那些使用百分号,这对于URL很有用,但对于文件名却没有那么多。我认为base64_encode()会更好,即使它是一个更长的字符串。但它包括对文件名无益的等号。

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

2 个答案:

答案 0 :(得分:2)

您的任务与创建url-safe base64编码字符串的问题非常类似。

请参阅此答案以获取一个示例:https://stackoverflow.com/a/5835352/660694

我的解决方案将是此变体。

在我的一个应用程序中,我有这个包装函数:

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

    return ($stripPadding) ? str_replace("~","",$encoded) : $encoded;
}

现在,您可以生成易于反转的文件名或url safe base64编码字符串。

请注意,如果您愿意,可以选择在字符串末尾删除填充,PHP在解码时不需要填充字符。

解码功能非常简单:

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

答案 1 :(得分:1)

假设您有一个名为“我的设备”的群组。然后使用md5对其名称进行哈希处理,以将其保存在数据库或其他内容中:

$group = 'My Device';
$filename = md5($group) . '.png';

要显示或使用它,您只需在任意位置再次散列组名称:

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