我正在使用以下正则表达式来检查图像文件名仅包含字母数字、下划线、连字符、小数点:
preg_match('!^[\w.-]*$!',$filename)
这工作正常。但我担心多字节字符。我应该专门处理它们以防止未确定的错误,还是这个正则表达式拒绝 mb 文件名好吗?
我正在使用以下正则表达式来检查图像文件名仅包含字母数字、下划线、连字符、小数点:
preg_match('!^[\w.-]*$!',$filename)
这工作正常。但我担心多字节字符。我应该专门处理它们以防止未确定的错误,还是这个正则表达式拒绝 mb 文件名好吗?
PHP 没有对多字节字符的“本机”支持;您需要使用“mbstring”扩展文档(可能可用也可能不可用)。此外,似乎没有办法创建“多字节字符串”,而是选择使用特殊的“mbstring”函数将本机字符串视为多字节字符串。换句话说,PHP 字符串不知道自己的字符编码——您必须手动跟踪它。
只要您使用 UTF-8(或类似)编码,您就可以摆脱它。UTF-8 总是将多字节字符编码为“高”字节(例如,ß
编码为0xcf 0x9f
),因此 PHP 可能会像对待任何其他字符一样对待它们。您将无法使用可能将多字节字符编码为“特殊”PHP 字节的编码,例如0x22
“双引号”符号。
PHP 中唯一知道如何处理多个字符集中的特定多字节字符的正则表达式函数是mb_ereg
Docs、mb_eregi
Docs、mb_ereg_replace
Docs和mb_eregi_replace
Docs。
基于 PCRE 的正则表达式函数(如preg_match
Docsu
)通过使用-modifier (PCRE8) Docs支持 UTF-8 。
但是当然,如上所述,PHP 字符串不知道自己的编码,因此您首先需要使用 mb_regex_encoding 函数指示“mbstring”库。请注意,该函数指定您匹配的字符串的编码,而不是包含正则表达式本身的字符串。