Регулярное выражение для UTF -8 допустимых имен файлов

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

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

// $filename = $_FILES['file']['name'];

$filename = 'Filename 123;".\'"."la\l[a]*(/.jpg
∮ E⋅da = Q,  n → ∞, ∑ f(i) = ∏ g(i), ∀x∈ℝ: ⌈x⌉ = −⌊−x⌋, α ∧ ¬β = ¬(¬α ∨ β),
  ℕ ⊆ ℕ₀ ⊂ ℤ ⊂ ℚ ⊂ ℝ ⊂ ℂ, ⊥ < a ≠ b ≡ c ≤ d ≪ ⊤ ⇒ (A ⇔ B),
  2H₂ + O₂ ⇌ 2H₂O, R = 4.7 kΩ, ⌀ 200 mm
sfajs,-=[];\',./09μετράει
าวนั้นเป็นชน
Καλημέρα κόσμε, コンニチハ
()_+{}|":?><';


// Replace symbols, punctuation, and ASCII control characters like \n or [BEL]
$filename = preg_replace('~[\p{S}\p{P}\p{C}]+~u', ' ', $filename);

Является ли этот подход безопасным для меня и подходящим для моих пользователей?

Обновление

Чтобы уточнить, я не использую имя файла для имени файла в файловой системе. Я генерирую уникальный хэш и использую его -. Мне просто нужно сохранить исходное имя для пользователей, поскольку именно так они распознают свои файлы. Хэш SHA1 или UUID для них ничего не значат.

6
задан Xeoncross 14 August 2012 в 18:31
поделиться