这个正则表达式是多字节安全吗?

时间:2011-03-20 22:36:01

标签: php regex preg-match multibyte

我正在使用以下正则表达式来检查图像文件名只包含字母数字,下划线,连字符,小数点:

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

这没关系。但我担心多字节字符。我应该专门处理它们以防止未确定的错误,还是这个正则表达式拒绝mb文件名好吗?

1 个答案:

答案 0 :(得分:1)

PHP对多字节字符没有“本机”支持;你需要使用"mbstring" extension­Docs(可能有也可能没有)。此外,似乎没有办法创建“多字节字符串”,而是选择通过使用特殊的“mbstring”函数将本地字符串视为多字节字符串。换句话说,PHP字符串不知道自己的字符编码 - 您必须手动跟踪它。

只要您使用UTF-8(或类似)编码,您就可以逃脱它。 UTF-8总是将多字节字符编码为“高”字节(例如,ß编码为0xcf 0x9f),因此PHP可能会像对待任何其他字符一样对待它们。您将无法使用可能将多字节字符编码为“特殊”PHP字节的编码,例如0x22,即“双引号”符号。

PHP中唯一知道如何处理多个字符集中特定多字节字符的正则表达式函数是mb_ereg­Docsmb_eregi­Docsmb_ereg_replace­Docs和{{3 }}

基于PCRE的正则表达式函数(如mb_eregi_replace­Docs)使用preg_match­Docs支持UTF-8。

但是,当然,如上所述,PHP字符串不知道自己的编码,因此首先需要使用mb_regex_encoding函数指示“mbstring”库。请注意,该函数指定了您匹配的字符串的编码,而不是包含正则表达式本身的字符串。