【问题标题】:Converting string in PHP to be used as file name...without stripping special characters将 PHP 中的字符串转换为文件名...不去除特殊字符
【发布时间】:2016-10-06 20:21:15
【问题描述】:

我们当前的系统保存与其父组名称匹配的文件。因此,名为“我的设备”的组保存了一个名为“我的设备.jpg”的图像。这很好用,尽管在 PHP 和 JS 的某处将名称转换为“My%20Devices.jpg”时存在一些问题,但在此之前我能够将空格转换为加号。

现在我们需要考虑其他特殊字符,例如撇号,以便可以将组命名为“Joe 的设备”。我需要某种方法将其转换为可以是文件名的东西。但是我不能只去掉特殊字符,否则如果有人使用“Joes Devices”的组名(不带撇号)可能会发生冲突。

我尝试了 urlencode() 和 rawurlencode(),但它们使用百分号,这对于 URL 来说非常有用,但对于文件名来说却不是。我认为 base64_encode() 会更好,即使它是一个更长的字符串。但它包含不适合文件名的等号。

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

【问题讨论】:

  • 您能解释一下“父组”是什么意思吗?
  • 您可以 md5 文件名,这样您的文件名中就没有任何空格或特殊字符。请记住 - 即使这不太可能 - 您仍然可能会遇到碰撞。
  • 只是家庭中WiFi上的一组设备。但它可以是一组任何东西,这只是意味着我必须将文件命名为与任意组名相同。
  • 哦,看起来我无法对 MD5 进行解码...
  • 如果我没记错的话,base64 总是以等号结尾,所以你可以使用 base64_encode 然后去掉结尾的等号。但是当你解码时,在解码之前添加尾随等号

标签: php string url


【解决方案1】:

您的任务与有关创建 url 安全的 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 安全的 base64 编码字符串,该字符串很容易可逆。

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

那么解码函数就很简单了:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 但是考虑到你不能得到My Device的哈希值是OP的重点。
    • 我现在明白了。但是为什么不将My Device 保存在数据库或文本文件中,这样他就可以使用基于“ID”的值并可能保存散列呢?至少文件名中不必有奇怪的符号是一种解决方法。
    • 我试图使这个修复尽可能小,如果可以的话,我不必重新编写它最初是如何完成的。但如果我必须重构它,那是个好主意。
    • 另一种方法可能是(即使我认为它不是很实用)将字符转换为它们的 ASCII 值并将其保存为 12_34_45_12。您可以轻松地将它们分开并“解码”回来。
    猜你喜欢
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    相关资源
    最近更新 更多