PHP:如何处理包含#数字符号的文件名?

PHP:如何处理包含#数字符号的文件名?,php,special-characters,filenames,file-handling,Php,Special Characters,Filenames,File Handling,我正在做一个小项目,为一些音频数据提供一个web界面。 我正在用PHP阅读现有文件夹的内容 以下是我的PHP代码: <?php $mp3folder = 'mp3/'; $oggfolder = 'ogg/'; $mp3files = glob($mp3folder.'*.mp3'); $oggfiles = glob($oggfolder.'*.ogg'); echo ' <script type="text/javascript"> $(document).read

我正在做一个小项目,为一些音频数据提供一个web界面。 我正在用PHP阅读现有文件夹的内容

以下是我的PHP代码:

<?php
$mp3folder = 'mp3/';
$oggfolder = 'ogg/';
$mp3files = glob($mp3folder.'*.mp3');
$oggfiles = glob($oggfolder.'*.ogg');
echo '
<script type="text/javascript">
    $(document).ready(function(){
    new jPlayerPlaylist({
        jPlayer: "#jquery_jplayer_1",
        cssSelectorAncestor: "#jp_container_1"
    }, [';


for ($i=0; $i<count($mp3files); $i++) {
    $namerr[$i] = substr($oggfiles[$i],strlen($oggfolder),strpos($oggfiles[$i], '.')-strlen($oggfolder));
    echo '{'."\n";
    echo 'title:"'.$namerr[$i].'",'."\n";
    echo 'mp3:"'.$mp3files[$i].'",'."\n";
    echo 'ogg:"'.$oggfiles[$i].'"'."\n";
    echo '},'."\n";
}
echo '
    ], {
        swfPath: "../../_res/jplayer",
        supplied: "ogg, mp3",
        wmode: "window",
        smoothPlayBar: true,
        keyEnabled: true
    });
});
</script>';

?> 
上面的php代码成功地读取了音频文件并从中构建了一个列表,因此jPlayer可以读取它们并从中显示播放列表。
问题是:jPlayer在文件名包含“#”符号时不会读取音频文件。 当我尝试播放“SONG#1.mp3”,然后查看Chromium中的调试器时,调试器会显示“未找到文件歌曲”,而它通常会输出类似“File”SONG FUN.mp3“successfully read”的内容

因此,我的结论是PHP在读取包含“#”的文件名时遇到了一些问题

或者jPlayer可能是这里的问题

顺便说一句:这是我的第一个PHP项目,所以如果有很多错误,请原谅。我相信有不同的更好的方法来解决这个问题。但我是个学习者


问候

jpi层是基于jquery的应用程序。它将输出的文件名视为实际URL。对于URL,hashtag表示不属于文件名的本地ID。例如,只返回“file”作为文件名,不包括#id

因此,您的问题可以从两个方面来看:

  • 它是由jPlayer中的营养化引起的,而营养化又是由URL定义中的限制引起的,或者
  • 这是因为你在一个不允许的地方使用了a

  • 由于您无法更改URL的定义方式,因此必须更改文件名,使其不包含哈希标记。

    感谢所有在这方面帮助过我的人!特别感谢@Wrikken

    我想我终于明白了: 当我使用
    urlencode()
    将URL转换为适当的形式时,我遇到了一个问题,即转换为
    +
    的空格会在应该转换为
    %20
    的位置进行标记。 据我所知,这主要是因为
    urlencode()
    用于查询,所以像
    index.php?search=Hello+World
    这样的东西

    解决方案是使用
    rawurlencode()

    因此,现在讨论的代码部分如下所示:

    AUDIO
     -> index.php
     -> OGG
       -> SONG#1.ogg
       -> SONG#n.ogg
       -> SONG FUN. ogg
     -> MP3
       -> SONG#1.mp3
       -> SONG#n.mp3
       -> SONG FUN.mp3
    
    for ($i=0; $i<count($mp3files); $i++) {
    $namerr[$i] = substr($oggfiles[$i],strlen($oggfolder),strpos($oggfiles[$i], '.')-strlen($oggfolder));
    echo '{'."\n";
    echo 'title:"'.$namerr[$i].'",'."\n";
    echo 'mp3:"'.dirname($mp3files[$i]).'/'.rawurlencode(basename($mp3files[$i])).'",'."\n";
    echo 'ogg:"'.dirname($oggfiles[$i]).'/'.rawurlencode(basename($oggfiles[$i])).'",'."\n";
    echo '},'."\n";
    }
    

    用于($i=0;$i首先,没有理由让你的文件名包含
    \
    。其次,你可以尝试使用
    \\\\\\\
    来逃避它。虽然不确定,但谢谢你的回答!有了这个解决方案,我必须将所有文件重命名为
    SONG\\\\\ 1.mp3
    对吗?我这样命名这些文件是因为文件系统从未抱怨过。。我不知道这会引起问题。我觉得你的结论很奇怪。你基本上说PHP正确地输出了文件名。但是你的jPlayer无法读取正确的名称。然后你继续说“我的结论是PHP在读取包含“#”的文件名时遇到了某种问题”…嗯?你刚才说PHP返回了一个正确的文件列表。所以你的结论应该是jPlayer有问题…仔细看jPlayer源代码,它似乎在href属性中创建了锚(-tags),其中包含指向mp3的url。在url中,hashtag(#)引用了本地对象(id)在同一页上,并且不被视为文件名的一部分。解析文件名的url将删除哈希标记部分,因此会给您带来您看到的问题。因此…简而言之:不要在文件名中使用哈希标记;)嗯…。谢谢@Tularis。好的观点!我想您是对的。我查看了“查看页面源代码”Firefox中的标签和php生成的JavaScript数据看起来是正确的:
    mp3:“mp3/SONG#3.mp3”,
    但是jPlayer不会播放该文件。那么,我如何更正jPlayer;-)?!