ZetCode

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 fnmatch 函数,并提供了实际示例,展示了在不同场景中的模式匹配。

作者

我的名字是 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出 所有 PHP 文件系统函数