PHP fnmatch 函数
最后修改于 2025 年 4 月 3 日
PHP 的 fnmatch
函数检查一个字符串是否匹配 shell 通配符模式。它对文件名匹配和模式验证很有用。
基本定义
fnmatch
函数测试一个字符串是否匹配给定的模式。它支持通配符,如 *、?,以及字符范围,如 [a-z]。
语法:fnmatch(string $pattern, string $string, int $flags = 0): bool
。如果字符串匹配模式,函数返回 true,否则返回 false。
基本 fnmatch 示例
这展示了 fnmatch
最简单的用法,使用了通配符模式。
basic_fnmatch.php
<?php declare(strict_types=1); $result = fnmatch("*.txt", "document.txt"); var_dump($result); // Outputs: bool(true)
这检查 "document.txt" 是否匹配 "*.txt" 模式。* 通配符匹配任何字符序列,所以任何 .txt 文件都将匹配。
问号通配符
? 通配符匹配模式中恰好一个字符。
question_mark.php
<?php declare(strict_types=1); $result1 = fnmatch("file?.txt", "file1.txt"); $result2 = fnmatch("file?.txt", "file12.txt"); var_dump($result1); // Outputs: bool(true) var_dump($result2); // Outputs: bool(false)
第一个例子匹配,因为 ? 匹配单个 "1"。第二个失败,因为 ? 不能匹配两个字符。每个 ? 必须恰好匹配一个字符。
字符范围
方括号定义字符范围,匹配其中的任何单个字符。
character_ranges.php
<?php declare(strict_types=1); $result1 = fnmatch("image_[0-9].jpg", "image_1.jpg"); $result2 = fnmatch("image_[0-9].jpg", "image_a.jpg"); var_dump($result1); // Outputs: bool(true) var_dump($result2); // Outputs: bool(false)
[0-9] 范围匹配任何单个数字。第一个例子匹配,因为 "1" 在范围内。第二个失败,因为 "a" 不是数字。
不区分大小写的匹配
FNM_CASEFOLD 标志使匹配不区分大小写。
case_insensitive.php
<?php declare(strict_types=1); $result = fnmatch("*.TXT", "document.txt", FNM_CASEFOLD); var_dump($result); // Outputs: bool(true)
没有这个标志,由于大小写不匹配,这将返回 false。使用 FNM_CASEFOLD,无论文件名中的大小写差异如何,模式都匹配。
目录匹配
fnmatch
可以匹配带有目录分隔符的路径。
directory_matching.php
<?php declare(strict_types=1); $result = fnmatch("/var/www/*.php", "/var/www/index.php"); var_dump($result); // Outputs: bool(true)
这检查整个路径是否匹配模式。* 通配符匹配路径的 "index" 部分。该函数在模式中字面意义地处理 / 字符。
最佳实践
- 模式清晰度: 尽可能使用简单的模式。
- 性能: 复杂的模式在大型输入上可能很慢。
- 安全性: 在安全上下文中,验证输入。
- 测试: 使用不寻常的文件名测试边界情况。
来源
本教程涵盖了 PHP fnmatch
函数,并提供了实际示例,展示了在不同场景中的模式匹配。
作者
列出 所有 PHP 文件系统函数。