1

次の正規表現を使用して、画像ファイル名に英数字、アンダースコア、ハイフン、小数点のみが含まれていることを確認しています。

preg_match('!^[\w.-]*$!',$filename) 

これは正常に動作します。しかし、マルチバイト文字について懸念があります。未確定のエラーを防ぐためにそれらを具体的に処理する必要がありますか、それともこの正規表現は mb ファイル名を拒否する必要がありますか?

4

1 に答える 1

2

PHP は、マルチバイト文字を「ネイティブ」にサポートしていません。「mbstring」拡張ドキュメントを使用する必要があります(利用できる場合と利用できない場合があります)。さらに、「マルチバイト文字列」自体を作成する方法はないように思われます。むしろ、特別な「mbstring」関数を使用して、ネイティブ文字列をマルチバイト文字列として扱うことを選択します。つまり、PHP 文字列は独自の文字エンコーディングを認識していません。手動で追跡する必要があります。

UTF-8 (または同様の) エンコーディングを使用している限り、問題を回避できる場合があります。UTF-8 は常にマルチバイト文字を「上位」バイトにエンコードするため (たとえば、ßとしてエンコードされます0xcf 0x9f)、PHP はおそらくそれらを他の文字と同じように扱います。0x22マルチバイト文字を「二重引用符」記号などの「特別な」PHP バイトにエンコードする可能性のあるエンコーディングを使用することはできません。

複数の文字セットの範囲から特定のマルチバイト文字を処理する方法を知っている PHP の唯一の正規表現関数は、 mb_eregDocsmb_eregiDocsmb_ereg_replaceDocs 、およびmb_eregi_replaceDocsです。

preg_matchDocsのような PCRE ベースの正規表現関数は、 u-modifier (PCRE8) Docsを使用して UTF-8 をサポートします。

しかしもちろん、上記のように PHP 文字列は独自のエンコーディングを認識しないため、最初に mb_regex_encoding 関数を使用して "mbstring" ライブラリに指示する必要があります。その関数は、正規表現自体を含む文字列ではなく、一致する文字列のエンコーディングを指定することに注意してください。

于 2011-03-20T22:40:36.220 に答える