讲师中心 微信公众号
AI工具推荐 视频效率加速

PHP教程:动态展示目录图片并从文件名提取名称

阿伟姑娘_5413

阿伟姑娘_5413

发布时间:2025-11-27 12:24:44

|

267人浏览过

|

来源于php中文网

原创

PHP教程:动态展示目录图片并从文件名提取名称

本教程详细介绍了如何使用php动态扫描指定目录下的jpg图片,并根据文件名(如'name-file.jpg')提取出图片关联的名称。通过`directoryiterator`遍历文件,结合正则表达式`preg_match`解析文件名,最终在网页上显示每张图片及其对应的名称,提供了一个高效且可扩展的图片展示解决方案。

在现代Web应用中,动态展示图片画廊或用户上传的图片是常见需求。本教程将引导您完成一个具体的场景:给定一个包含命名规则为Name-file.jpg的JPG图片目录,我们需要使用PHP脚本遍历该目录,不仅在网页上显示每张图片,还要从文件名中提取出“Name”部分,并将其作为图片的描述或标题一同展示。

场景概述

假设您的服务器上有一个名为images的目录,其中包含以下格式的JPG文件:

  • Bob-file.jpg
  • Tom-file.jpg
  • Dave-file.jpg
  • Douglas-file.jpg 该目录可能只包含JPG文件,且文件名始终遵循[名称]-file.jpg的模式。我们的目标是编写一个PHP脚本,能够识别这些图片,提取出文件名中的“Bob”、“Tom”等名称,并在网页上以“图片 [名称]”的形式显示。

核心技术点

要实现这一目标,我们将主要利用PHP的以下功能:

  1. DirectoryIterator: 用于高效地遍历文件系统中的目录。
  2. preg_match: 用于使用正则表达式从文件名中提取所需的信息。
  3. HTML输出: 构建适当的HTML结构来显示图片和文本。

实现步骤

1. 初始化目录迭代器

首先,我们需要指定图片所在的服务器文件路径,并创建一个DirectoryIterator实例来遍历该目录。

立即学习“PHP免费学习笔记(深入)”;

// 定义图片所在的服务器文件路径
// 注意:这应该是服务器上的绝对或相对路径,而不是Web访问路径
$imageDirectoryPath = './path/to/image/dir'; 

// 创建DirectoryIterator实例
// 确保该路径存在且PHP有读取权限
$iterator = new DirectoryIterator($imageDirectoryPath);

请将./path/to/image/dir替换为您的实际图片目录在服务器上的路径。

2. 遍历并过滤文件

DirectoryIterator会返回目录中的所有条目,包括.和..等特殊目录。我们需要过滤掉这些以及任何非图片文件。

html-deploy
html-deploy

使用 htmlcode.fun 将 HTML 内容或文件部署到网页,适用于用户要求“部署到网页”“托管此 HTML”“生成此前端...的实时链接”等场景。

下载
foreach ($iterator as $file) {
    // 忽略 . 和 .. 目录
    if ($file->isDot()) {
        continue;
    }

    // 进一步过滤,确保只处理符合命名规则的JPG文件
    // 这里的正则表达式在下一步详细解释
    // preg_match('#^(.+)\-file\.jpg$#uD', $file->getFilename(), $details)
}

3. 使用正则表达式提取名称

这是实现动态名称提取的关键步骤。我们将使用preg_match函数配合正则表达式来解析文件名。

正则表达式解释:

  • #^(.+)\-file\.jpg$#uD:这是一个匹配Name-file.jpg格式的正则表达式。
    • ^:匹配字符串的开始。
    • (.+):这是一个捕获组,(和)之间的内容将被捕获。.匹配除了换行符以外的任何字符,+表示匹配一次或多次。这会捕获文件名中file.jpg之前的所有字符(即“Name”部分)。
    • \-:匹配字面上的连字符-。\是转义字符,因为-在正则表达式中可能有特殊含义。
    • file\.jpg:匹配字面上的file.jpg。\.是转义字符,因为.在正则表达式中是特殊字符,表示匹配任何单个字符。
    • $:匹配字符串的结束。
    • u:Unicode修饰符,确保正确处理UTF-8字符。
    • D:PCRE_ANCHORED修饰符,确保$只匹配字符串的结束,而不匹配换行符。

preg_match函数将尝试匹配文件名。如果匹配成功,它会返回1,并将捕获到的内容存储在$details数组中。$details[0]将包含整个匹配的字符串(即完整的文件名),而$details[1]将包含第一个捕获组的内容(即我们想要的“Name”)。

4. 构建并输出HTML

最后一步是使用提取到的信息来构建HTML,并在浏览器中显示图片及其名称。为了安全起见,所有输出到HTML的内容都应该通过htmlentities()进行编码,以防止跨站脚本(XSS)攻击。

<?php

// 定义图片所在的服务器文件路径
$imageDirectoryPath = './path/to/image/dir'; 

// 定义图片在Web服务器上的可访问URL路径
// 例如,如果您的图片目录在网站根目录下的 'images' 文件夹中
$webAccessibleImagePath = '/web/path/to/images/'; 

// 确保目录存在且可读
if (!is_dir($imageDirectoryPath) || !is_readable($imageDirectoryPath)) {
    echo '<p>错误:图片目录不存在或不可读。</p>';
    exit;
}

echo '<h1>图片展示</h1>';
echo '<div style="display: flex; flex-wrap: wrap; gap: 20px;">'; // 简单的Flex布局

foreach ((new DirectoryIterator($imageDirectoryPath)) as $file) {
    // 忽略 . 和 .. 目录
    if ($file->isDot()) {
        continue;
    }

    // 检查文件名是否符合 'Name-file.jpg' 格式
    // 并提取名称信息
    if (preg_match('#^(.+)\-file\.jpg$#uD', $file->getFilename(), $details) === 1) {
        // $details[0] 包含完整文件名,例如 "Bob-file.jpg"
        // $details[1] 包含捕获的名称,例如 "Bob"

        // 构建图片的完整Web访问URL
        $imageUrl = $webAccessibleImagePath . $details[0];
        // 提取出的名称
        $personName = $details[1];

        // 使用printf格式化输出HTML
        // htmlentities() 用于防止XSS攻击
        printf(
            '<div style="border: 1px solid #ccc; padding: 10px; text-align: center;">
                <img src="%s" alt="图片:%s" style="max-width: 200px; height: auto; display: block; margin: 0 auto 10px;">
                <p><strong>%s</strong></p>
            </div>',
            htmlentities($imageUrl),
            htmlentities($personName),
            htmlentities($personName)
        );
    }
}
echo '</div>'; // 关闭flex布局的div

?>

完整示例代码

将上述步骤整合到一起,您将得到以下完整的PHP脚本:

<?php

/**
 * PHP教程:动态展示目录图片并从文件名提取名称
 *
 * 本脚本演示如何遍历指定目录下的JPG图片,
 * 根据 'Name-file.jpg' 的命名约定提取名称,
 * 并在网页上显示图片及其对应的名称。
 */

// --- 配置项 ---
// 1. 定义图片所在的服务器文件系统路径。
//    例如:'/var/www/html/images' 或 './images' (相对于当前脚本的路径)
//    请确保此路径是正确的服务器路径,而不是Web URL。
$imageDirectoryPath = './images'; 

// 2. 定义图片在Web服务器上的可访问URL路径。
//    例如:'http://yourdomain.com/images/' 或 '/images/' (相对于网站根目录)
//    此路径用于在HTML中构建图片的src属性。
$webAccessibleImagePath = '/images/'; 
// --- 配置项结束 ---


// 确保图片目录存在且PHP有读取权限
if (!is_dir($imageDirectoryPath)) {
    echo '<p style="color: red;">错误:图片目录不存在。请检查配置项 $imageDirectoryPath。</p>';
    exit;
}
if (!is_readable($imageDirectoryPath)) {
    echo '<p style="color: red;">错误:图片目录不可读。请检查文件权限。</p>';
    exit;
}

echo '<!DOCTYPE html>';
echo '<html lang="zh">';
echo '<head>';
echo '    <meta charset="UTF-8">';
echo '    <meta name="viewport" content="width=device-width, initial-scale=1.0">';
echo '    <title>动态图片画廊</title>';
echo '    <style>';
echo '        body { font-family: Arial, sans-serif; margin: 20px; background-color: #f4f4f4; }';
echo '        h1 { color: #333; text-align: center; margin-bottom: 30px; }';
echo '        .image-gallery { display: flex; flex-wrap: wrap; justify-content: center; gap: 25px; }';
echo '        .image-item {';
echo '            background-color: #fff;';
echo '            border: 1px solid #ddd;';
echo '            border-radius: 8px;';
echo '            box-shadow: 0 2px 5px rgba(0,0,0,0.1);';
echo '            padding: 15px;';
echo '            text-align: center;';
echo '            width: 220px; /* 固定宽度 */';
echo '            box-sizing: border-box;';
echo '            transition: transform 0.2s ease-in-out;';
echo '        }';
echo '        .image-item:hover { transform: translateY(-5px); }';
echo '        .image-item img {';
echo '            max-width: 100%;';
echo '            height: 150px; /* 固定高度,图片可能会被裁剪或拉伸 */';
echo '            object-fit: contain; /* 保持图片比例 */';
echo '            border-radius: 4px;';
echo '            margin-bottom: 10px;';
echo '            display: block; /* 移除图片底部额外空间 */';
echo '            margin-left: auto;';
echo '            margin-right: auto;';
echo '        }';
echo '        .image-item p {';
echo '            margin: 0;';
echo '            font-size: 1.1em;';
echo '            color: #555;';
echo '            font-weight: bold;';
echo '        }';
echo '    </style>';
echo '</head>';
echo '<body>';
echo '    <h1>动态图片画廊</h1>';
echo '    <div class="image-gallery">';

try {
    // 创建DirectoryIterator实例
    $iterator = new DirectoryIterator($imageDirectoryPath);

    foreach ($iterator as $file) {
        // 1. 忽略 . 和 .. 目录
        if ($file->isDot()) {
            continue;
        }

        // 2. 使用正则表达式检查文件名是否符合 'Name-file.jpg' 格式
        //    并捕获文件名中的 'Name' 部分
        //    $details[0] 会包含完整的匹配字符串 (例如 "Bob-file.jpg")
        //    $details[1] 会包含第一个捕获组的内容 (例如 "Bob")
        if (preg_match('#^(.+)\-file\.jpg$#uD', $file->getFilename(), $details) === 1) {
            // 构建图片的完整Web访问URL
            // 注意:这里需要拼接 $webAccessibleImagePath 和完整的文件名
            $imageUrl = $webAccessibleImagePath . $details[0];
            // 提取出的名称
            $personName = $details[1];

            // 3. 格式化输出HTML,显示图片和名称
            //    htmlentities() 用于将特殊字符转换为HTML实体,防止XSS攻击
            printf(
                '<div class="image-item">
                    <img src="%s" alt="图片:%s">
                    <p>%s</p>
                </div>',
                htmlentities($imageUrl),  // 图片URL
                htmlentities($personName), // 图片alt文本
                htmlentities($personName)  // 显示的名称
            );
        }
    }
} catch (UnexpectedValueException $e) {
    echo '<p style="color: red;">处理目录时发生错误:' . htmlentities($e->getMessage()) . '</p>';
}

echo '    </div>'; // 关闭 .image-gallery
echo '</body>';
echo '</html>';

?>

注意事项与最佳实践

  1. 路径管理: 区分服务器文件系统路径($imageDirectoryPath)和Web可访问URL路径($webAccessibleImagePath)。DirectoryIterator使用前者来查找文件,而HTML的<img>标签src属性需要后者才能在浏览器中正确加载图片。请务必根据您的服务器配置正确设置这两个路径。
  2. 安全性: 始终使用htmlentities()(或htmlspecialchars())对所有用户输入或从文件系统读取并输出到HTML的内容进行编码,以防止XSS攻击。本教程中的示例已包含此项。
  3. 错误处理: 建议添加错误处理机制,例如检查$imageDirectoryPath是否存在且可读,以及DirectoryIterator在遇到问题时可能抛出的UnexpectedValueException。
  4. 性能优化: 对于包含大量图片的目录,每次请求都遍历整个目录可能会影响性能。可以考虑以下优化:
    • 缓存: 将文件列表和提取的名称缓存起来(例如,使用文件缓存、Memcached或Redis),定期更新。
    • 分页: 如果图片数量非常大,实现分页显示,每次只加载一部分图片。
  5. 正则表达式的灵活性: 本教程使用的正则表达式^(.+)\-file\.jpg$是针对特定命名约定的。如果您的文件名约定发生变化(例如Name_ID.png),您需要相应地调整正则表达式。
  6. 文件类型过滤: 虽然本例中假定目录只包含JPG文件,但在实际应用中,您可能需要更严格地检查文件扩展名(例如使用$file->getExtension())来确保只处理预期的图片类型。

总结

通过本教程,您学会了如何利用PHP的DirectoryIterator和preg_match函数,高效地扫描服务器上的图片目录,从遵循特定命名规则的文件名中提取关键信息,并安全地在Web页面上动态展示这些图片及其关联的名称。这种方法为构建动态图片画廊和内容管理系统提供了基础,并强调了在Web开发中路径管理和安全性的重要性。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

4076

2023.06.20

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

2621

2023.07.05

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

7142

2023.07.05

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

792

2023.08.11

正则表达式空格
正则表达式空格

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

500

2023.08.31

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

653

2023.11.13

正则表达式空格如何表示
正则表达式空格如何表示

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。想了解更多正则表达式空格怎么表示的内容,可以访问下面的文章。

386

2023.11.17

正则表达式中如何匹配数字
正则表达式中如何匹配数字

正则表达式中可以通过匹配单个数字、匹配多个数字、匹配固定长度的数字、匹配整数和小数、匹配负数和匹配科学计数法表示的数字的方法匹配数字。更多关于正则表达式的相关知识详情请看本专题下面的文章。php中文网欢迎大家前来学习。

719

2023.12.06

FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

40

2026.10.08

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn