Будет ли это регулярное выражение безопасным? - PullRequest
1 голос
/ 21 марта 2011

Я использую следующее регулярное выражение, чтобы проверить, что имя файла изображения содержит только буквенно-цифровые символы, подчеркивание, дефис, десятичную точку:

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

Это работает нормально. Но у меня есть опасения по поводу многобайтовых символов. Должен ли я специально обрабатывать их, чтобы предотвратить неопределенные ошибки, или это регулярное выражение отклоняет имена файлов mb, хорошо?

1 Ответ

1 голос
/ 21 марта 2011

PHP не имеет «нативной» поддержки многобайтовых символов; вам нужно использовать расширение "mbstring" & shy; Docs (которое может быть или не быть доступным). Более того, может показаться, что нет способа создать «многобайтовую символьную строку», как таковую; скорее, каждый выбирает обработку нативной строки как многобайтовой символьной строки, используя специальные функции «mbstring». Другими словами, строка PHP не знает своей собственной кодировки символов - вы должны отслеживать ее вручную.

Возможно, вам это удастся, если вы используете кодировку UTF-8 (или аналогичную). UTF-8 всегда кодирует многобайтовые символы в «старшие» байты (например, ß кодируется как 0xcf 0x9f), поэтому PHP, вероятно, будет обрабатывать их так же, как и любой другой символ. Вы не сможете использовать кодировку, которая потенциально может кодировать многобайтовый символ в «специальные» байты PHP, такие как 0x22, символ «двойной кавычки».

Единственные функции регулярных выражений в PHP, которые знают, как работать с конкретными многобайтовыми символами из диапазона множественных наборов символов, - это mb_ereg & shy; Docs , mb_eregi Документы , mb_ereg_replace & Документы и mb_eregi_replace Документы .

Функции регулярных выражений на основе PCRE, такие как preg_match & shy; Документы поддерживают UTF-8 с помощью модификатора u (PCRE8 ) & застенчивый;. Docs 1058 *

Но, конечно, как описано выше, строки PHP не знают своей собственной кодировки, поэтому сначала вам нужно указать библиотеке mbstring, используя функцию mb_regex_encoding. Обратите внимание, что эта функция определяет кодировку строки, которую вы сопоставляете, а не строку, содержащую само регулярное выражение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...