将文件夹重命名(PHP)

7
我有一个简单的ul类别照片库。 这些类别是服务器上的文件夹。 如果文件夹名为"Ödla",那么类别名称也为"Ödla"。 是否可以只将类别中的"Ö"替换为"o",而不是实际的服务器文件夹。我不想使用mysql。 希望你能理解我的意思。
编辑:类别只是文本链接。
  • Ödla
  • Category 2
在这个例子中,我的服务器上有两个文件夹,分别命名为"Ödla"和"Category 2"。
我只想重命名类别链接,而不是文件夹。

请澄清您的问题,'category' 是应该显示的文本,允许在URL/输入字段中使用 Ö,还是其他什么? - Lekensteyn
可能是这个问题的重复:https://dev59.com/5HI-5IYBdhLWcg3wYXH8 - Dave
4个回答

16

您可以始终使用PHP函数rename()。使用@steven_desu的str_replace方法,您可以将旧文件夹的重命名为新名称。请查看文档。

http://www.php.net/manual/en/function.rename.php

编辑

例:

<?php
// Create arrays with special chars
$o = array('Ò','Ó','Ô','Õ','Ö','ò','ó','ô','õ','ö');
// Remember to remove the slash at the end otherwise it will not work
$oldname = '/path/to/directory/Ödla';

// Get the directory name
$old_dir_name = substr($oldname, strrpos($oldname, '/') + 1);

// Replace any special chars with your choice
$new_dir_name = str_replace($o, 'O', $old_dir_name);

// Define the new directory
$newname = '/path/to/new_directory/' . $new_dir_name;

// Renames the directory
rename($oldname, $newname);

?>

请在这个问题上检查我吗?


2
假设您已经通过while()循环或glob()函数获取了服务器上的文件夹列表,并且该列表存储在$folderList[]中,如果您只是输出结果,我建议尝试以下方法:
$a = array(...);
$e = array(...);
$i = array(...);
$o = array('Ò','Ó','Ô','Õ','Ö','ò','ó','ô','õ','ö');
$u = array(...);
foreach($folderList as $folder){
    $folder = str_replace($a,"a",$folder);
    $folder = str_replace($e,"e",$folder);
    $folder = str_replace($i,"i",$folder);
    $folder = str_replace($o,"o",$folder);
    $folder = str_replace($u,"u",$folder);
}

这段代码相当粗糙,但也比较简单。如果您想要更快的运行速度,可以使用unicode的二进制值进行数学计算或比较。例如,$o 数组中的所有内容都是unicode字符00D2到00D6和00F2到00F6。所以,如果字母在 dechex('00D2')dechex('00D6') 之间,或者在 dechex('00F2')dechex('00F6') 之间,则用 "o" 替换。
如果您在没有特殊字符的情况下获取值(例如通过URL post),并且想将其映射到一个文件夹,则必须采取稍微不同的方法。首先,请意识到这不是理想的解决方案,因为您可能有两个文件夹,一个名为Òdla,另一个名为Ödla。在这种情况下,搜索短语odla只能引用其中之一。另一个将被永久忽略。假设您可以接受这一点(例如:您可以保证不会有重复的文件夹名称),那么您可能希望使用GLOB_BRACE
<?php
    $vowels = array("a", "e", "i", "o", "u");
    $replace = array("...", "...", "...", "{Ò,Ó,Ô,Õ,Ö,ò,ó,ô,õ,ö}", "...");

    $search = "odla";
    $search = str_replace($vowels, $replace, $search);

    // Returns every folder who matches "Òdla", "Ódla", "Ôdla"....
    glob($search, GLOB_BRACE);
?>

如果我使用你的示例,查找文件夹中的图像不会出现任何问题吗?我尝试过类似的操作,但是“odla”无法在“Ödla”中找到图像。 - Boo
你只需要更改显示的名称,而不是链接指向的位置,例如 <a href="/Ödla/pic.jpeg">Olda</a>。 - Dave
显示的名称与链接相同。类别名称显示在URL中,例如http://domain.com/index.php?cat=Ödla,我希望它是?cat=odla。 - Boo
@Boo Ah。我现在理解这个问题了。我原本认为你只需要在所有解析完成后显示不同的名称。但我没有意识到它作为URL的一部分被发送。我会更新我的回答。 - stevendesu

2

1

我看了@steven_desu写的内容,觉得很有趣,但是我不确定如何使用它。我已经尝试过这个:

<?php
function fixlink($link){
    $match = array('Å','Ä','Ö','å','ä','ö',' ');
    $replace = array('a','a','o','a','a','o','-');
    return str_replace($match, $replace, $link);
}
function matchlink($search){
    $vowels = array("a", "e", "i", "o", "u");
    $replace = array("...", "...", "...", "{Ò,Ó,Ô,Õ,Ö,ò,ó,ô,õ,ö}", "...");

    $search = "odla";
    $search = str_replace($vowels, $replace, $search);

    // Returns every folder who matches "Òdla", "Ódla", "Ôdla"....
    glob($search, GLOB_BRACE);
}
echo "<a href=\"index.php?page=".matchlink(fixlink($file))."\">".$file."</a>";
?>

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