升级至PHP 7.4后MP3文件遍历代码故障求助
修复PHP 7.4下的MP3文件遍历代码
问题分析
split()函数废弃:PHP 7.0起split()已被彻底移除,即便改用preg_split()也因正则写法或多文件名场景容易出错,更适合用专门处理文件路径的函数替代。- 文件过滤逻辑不严谨:原代码中
substr($file,1) != '.'的写法不够直观,无法准确过滤隐藏文件。 - 输出截断/格式问题:原代码中转义处理不完整,可能导致HTML属性被破坏,同时
stripslashes()在PHP 7.4环境下大多属于冗余操作(默认已关闭magic_quotes_gpc)。
修复后的代码
<music> <?php $targetDir = 'files/mp3'; if ($handle = opendir($targetDir)) { while (false !== ($file = readdir($handle))) { // 跳过当前目录、上级目录,以及以.开头的隐藏文件 if ($file === '.' || $file === '..' || substr($file, 0, 1) === '.') { continue; } // 用pathinfo解析文件信息,准确分离文件名和扩展名 $fileInfo = pathinfo($file); if (isset($fileInfo['extension']) && strtolower($fileInfo['extension']) === 'mp3') { // 转义HTML属性,确保单引号也被处理,避免格式破坏 $safeSongName = htmlspecialchars($fileInfo['filename'], ENT_QUOTES); echo "<song name='{$safeSongName}' />"; } } closedir($handle); } ?> </music>
关键修改说明
- 替换
split()为pathinfo():pathinfo()是PHP原生的文件路径解析函数,能精准分离文件名和扩展名,即便文件名包含多个.也能正确处理,比字符串拆分更可靠。 - 优化文件过滤逻辑:直接通过
substr($file, 0, 1) === '.'判断隐藏文件,逻辑清晰易懂,避免原代码的模糊判断。 - 完善HTML转义:使用
ENT_QUOTES参数让htmlspecialchars()同时转义单引号和双引号,彻底避免属性值中的特殊字符破坏HTML结构。 - 移除冗余操作:去掉不必要的
stripslashes(),PHP 7.4默认已关闭魔术引号,无需手动去除转义。
内容的提问来源于stack exchange,提问作者kitsaras
相关产品推荐
相关产品推荐

