2011-03-20 39 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