プログラミングでは、 fnmatch()は、パターンに基づいてファイル名を一致させるために使用される非常に一般的な関数です。 PHPでは、 fnmatch()は、ワイルドカードマッチングなど、ファイルシステムのファイル名を一致させるために主に使用されます。ただし、多くの開発者は、特にWindowsやLinux環境でプラットフォーム全体で開発する際に、 FNMATC()が異なるオペレーティングシステムで異なる動作をすることを発見しました。それでは、なぜFnMatch()がこれら2つのオペレーティングシステムで異なる動作を示すのでしょうか?オペレーティングシステムの違いは、ファイルマッチングの結果に本当に影響しますか?
まず、 fnmatch()関数の基本的な使用法を理解する必要があります。 fnmatch()関数は、特定の文字列の一致する状況をパターンと比較するために使用されます。その構文は次のとおりです。
<span><span><span class="hljs-title function_ invoke__">fnmatch</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$pattern</span></span><span>, </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$filename</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$flags</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>): </span><span><span class="hljs-keyword">bool</span></span><span>
</span></span>
$パターン:マッチングに使用されるパターン、通常はワイルドカード文字( * 、?など)が含まれています。
$ filename :一致するファイル名。
$フラグ:一致する動作を変更するために使用できる一致するフラグ。
例えば:
<span><span><span class="hljs-title function_ invoke__">fnmatch</span></span><span>(</span><span><span class="hljs-string">'*.txt'</span></span><span>, </span><span><span class="hljs-string">'document.txt'</span></span><span>); </span><span><span class="hljs-comment">// 戻る true,試合が成功したからです</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fnmatch</span></span><span>(</span><span><span class="hljs-string">'test?.php'</span></span><span>, </span><span><span class="hljs-string">'test1.php'</span></span><span>); </span><span><span class="hljs-comment">// 戻る true,試合が成功したからです</span></span><span>
</span></span>
Windowsオペレーティングシステムでは、 fnmatch()はファイル名マッチングに対してケース非感受性です。これは、NTFSやFAT32などのWindowsファイルシステムがデフォルトでケースに依存しないファイル名の一致ルールを採用しているためです。したがって、Windows Systemsでは、 fnmatch()はマッチングのファイル名のケースの違いを無視します。
たとえば、Windowsでは、ファイル名test.txtがある場合、 fnmatch( '*。txt'、 'test.txt')は、Windowsシステムがファイル名に敏感ではないためTrueを返します。
Linux環境では、ファイルシステムは通常、ケースに敏感です(Ext4ファイルシステムなど)。したがって、Linuxでは、 fnmatch()はファイル名の場合に厳密に一致します。つまり、 fnmatch()はケースの違いを自動的に無視しません。
たとえば、Linuxでは、 fnmatch( ' *。txt'、 'test.txt')は、 test.txtのファイル拡張機能がパターン*.txt (注意事項)と一致しないためfalseを返します。
WindowsとLinuxの間には、ファイルシステム設計には本質的な違いがあり、ファイル名のマッチングの違いにもつながります。
Windows :NTFSやFAT32などのWindowsが使用するファイルシステムは、デフォルトでケースに依存しないファイル名マッチングルールを採用しています。これは、Windowsでは、ファイル名test.txtとtest.txtが同じファイルと見なされることを意味します。
Linux :ext4などのLinuxの共通ファイルシステムは、デフォルトではケースに敏感です。 Linuxでは、ファイル名test.txtとtest.txtは2つのまったく異なるファイルであり、その一致するルールもケースに敏感です。
fnmatch()はWindowsではデフォルトではケース非感受性であるが、Linuxではケースに敏感であるため、ファイル名が一致するときに異なる動作につながります。
さまざまなオペレーティングシステムでfnmatch()を使用する場合の予測不可能な動作を回避するために、開発者は一致する結果が一貫していることを確認するためにいくつかの措置を講じることができます。
統一されたファイル名ケース:ファイル名を一致させる前に、ファイル名を均一に小文字または大文字に変換して、異なるオペレーティングシステムで一貫した一致する動作を確保します。たとえば、 strtolower()またはstrtoupper()を使用して、ファイル名のケースを強制することができます。
<span><span><span class="hljs-variable">$pattern</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strtolower</span></span><span>(</span><span><span class="hljs-string">'*.txt'</span></span><span>);
</span><span><span class="hljs-variable">$filename</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strtolower</span></span><span>(</span><span><span class="hljs-string">'Test.TXT'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fnmatch</span></span><span>(</span><span><span class="hljs-variable">$pattern</span></span><span>, </span><span><span class="hljs-variable">$filename</span></span><span>); </span><span><span class="hljs-comment">// 一貫したケースを確保します</span></span><span>
</span></span>
FLAGパラメーターを使用: FNMATC()は、一致する動作を調整するために使用できる3番目のパラメーターフラグを提供します。たとえば、 fnm_casefoldフラグを使用して、ケース非感受性のマッチングを強制します。
<span><span><span class="hljs-title function_ invoke__">fnmatch</span></span><span>(</span><span><span class="hljs-string">'*.txt'</span></span><span>, </span><span><span class="hljs-string">'Test.TXT'</span></span><span>, FNM_CASEFOLD); </span><span><span class="hljs-comment">// 存在する Windows そして Linux ケースに敏感ではありません</span></span><span>
</span></span>
WindowsおよびLinuxでのfnmatch()の動作の違いは、主にオペレーティングシステム内のファイルシステムの異なる設計によるものです。 Windowsファイルシステムは通常、ケースに依存しませんが、Linuxファイルシステムは通常、ケースに敏感です。これらの違いは、両方のオペレーティングシステム、特にケースマッチングでfnmatch()の異なる動作につながります。 fnmatch()フラグパラメーターと統一されたファイル名ケースを合理的に使用することにより、開発者はクロスプラットフォームの一貫性を確保し、それによりオペレーティングシステムの違いが一致する結果に与える影響を減らすことができます。