2011-03-20 75 views
1

我使用正则表达式如下检查的图像文件名只包含字母数字,下划线,连字符,小数点:这个正则表达式是多字节安全的吗?

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

该工程确定。但我担心多字节字符。我应该专门处理它们以防止未确定的错误,或者如果这个正则表达式拒绝MB文件名好吗?

回答

1

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

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

唯一的正则表达式函数知道如何处理特定的多字节字符了一系列的多字符集是mb_ereg­Docsmb_eregi­Docsmb_ereg_replace­Docsmb_eregi_replace­Docs

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

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

+0

感谢您的信息,多字节编码可以更容易在PHP我感觉。 – Spoonface 2011-03-21 23:27:27