【问题标题】:How to remove beginning of filename in PHP?如何在 PHP 中删除文件名的开头?
【发布时间】:2015-05-19 11:18:13
【问题描述】:

我正在 jssor 中制作一个画廊,幻灯片是通过读取一个目录并使用 PHP 脚本为每个图像编写 div 来制作的。在图像下方显示一个标题,其中包含艺术家的姓名(始终相同),后跟不带扩展名的文件名。

这是我目前所拥有的:

<?

$dir = 'Photo/Paintings';
$files = scandir($dir);
sort($files);
foreach ($files as $file) {
    if ($file != '.' && $file != '..') {
        echo '<div>
                <img u="image" style="max-height:460px;" src="Photo/Paintings/'.$file.'" />
               <img u="thumb" src="Photo/Paintings/'.$file.'" />';
        $withoutExt = preg_replace('/\\.[^.\\s]{3,4}$/', '', $file);
            echo '<div u="caption" style="position: absolute; top: 470px; left: 0px; height: 10px; text-align: center;">
                      ARTISTX - '.$withoutExt.'
              </div>
        </div>';
    }
}

?> 

这些图像应该按特定顺序排列,所以我的想法是在每个文件名的开头添加一个数字,例如#5-Picture of tree.jpg。我的问题是,如何将这个 #5 部分也从标题中显示出来?

或者,有没有更好的方法来确定这些文件的顺序?我现在意识到我的想法甚至不能很好地工作,因为 #1 会按字母顺序跟随 #11 和 #12 而不是 #2。我也许可以通过使用字母 1A、1B、1C、2A 等的组合来解决这个问题。

【问题讨论】:

    标签: php gallery jssor


    【解决方案1】:

    这仅在文件名实际以数字开头时才生效:

    $str = preg_replace('/^\\d+-/', null, $fileName);
    

    不以#{number}- 开头的文件将不受此剪裁过程的影响。

    对于您的排序问题。在前面放一个填充0。所以使用0102,...等等直到99

    顺便说一句。不要使用简短的 PHP 标签。始终在 PHP 块的开头使用&lt;?php

    【讨论】:

    • 本垒打! 0 前缀是天才,我怎么没想到 :) 使用主题标签破坏了链接(也许它是 Linux 服务器的东西?)。我可以像这样使用 0 作为字符串的开始引用: $str = preg_replace('/^0\\d+-/', null, $fileName);
    • 不,你不能。然后11 不会被正则表达式匹配。只有011。只需使用我提供的正则表达式即可。
    • 是的,我就是这么想的。我总是可以使用 3 位数前缀 001、011 等等。
    • 即使是三位数的前缀也会被我的正则表达式缓存。实际上,任何长度的数字前缀都会被捕获。
    • 我明白,但我不能在文件名中使用#-符号。我的 Linux 服务器拒绝在图库中读取和显示它。
    【解决方案2】:

    你只能得到字符串的一部分:

    $str = substr($str, 3);
    

    或者你删除-之前的部分显式:

    $ex = explode("-", $str);
    unset($ex[0]);
    $str = implode("-", $ex);
    

    如果第一部分可以有3个以上的字符,则第二种方法更好。

    或者,有没有更好的方法来确定这些文件的顺序?我现在意识到我的想法甚至不能很好地工作,因为 #1 会按字母顺序跟随 #11 和 #12 而不是 #2。我也许可以通过使用字母 1A、1B、1C、2A 等的组合来解决这个问题。

    使用这个:

    $myFiles = Array();
    foreach($files as $file){
      // ...
      $myFiles[str_replace("#", "", explode("-", $file)[0]))] = $file;
    }
    ksort($myFiles);
    
    foreach($myFiles as $file){
      // display
    }
    

    【讨论】:

      【解决方案3】:

      要回答您的第二个问题,您不必更改为 1A、2B... 类似 natsort natsort

      【讨论】:

        猜你喜欢
        • 2021-06-29
        • 1970-01-01
        • 1970-01-01
        • 2020-10-31
        • 2016-03-17
        • 2014-03-29
        • 2014-03-19
        • 1970-01-01
        相关资源
        最近更新 更多