Функция sanitize_file_name() в WordPress
Функция sanitize_file_name() служит для очистки имени файла, заменяя пробелы на дефисы и удаляя специальные символы, которые могут быть не допустимы на некоторых операционных системах. Давайте подробнее рассмотрим, как она работает и как её использовать.
Как работает функция
Эта функция:
- Удаляет специальные символы, такие как скобки и запятые, из имени файла.
- Заменяет пробелы и последовательные дефисы на один дефис.
- Обрезает точки, дефисы и символы подчеркивания в начале и конце имени файла.
Важно: Функция не гарантирует, что возвращаемое имя файла будет допустимо для загрузки.
Время выполнения
- 1 раз — 0.0000939 секунды (очень быстро)
- 50,000 раз — 0.28 секунды (тоже очень быстро)
Работает на PHP версии 7.4.33 и WordPress версии 6.1.1.
Хуки функции
sanitize_file_name_charssanitize_file_name
Возвращаемое значение
Функция возвращает строку — очищенное имя файла.
Использование
Чтобы использовать функцию, нужно передать ей имя файла в качестве параметра:
sanitize_file_name( $filename );
Параметры
$filename(string) — обязательный параметр, имя файла, которое нужно очистить.
Примеры
Пример 1: Очистка имени файла перед загрузкой
Функция удаляет все специальные символы из имени файла:
$filename = '__my--file-&,-[name]-<->;.jpg';
$filename = sanitize_file_name( $filename ); // Результат: my-file-name-.jpg
Код функции
Вот как выглядит код функции sanitize_file_name():
function sanitize_file_name( $filename ) {
$filename_raw = $filename;
$filename = remove_accents( $filename );
// Массив специальных символов для удаления
$special_chars = array( '?', '[', ']', '/', '', '=', '<', '>', ':', ';', ',', "'", '"', '&', '$', '#', '*', '(', ')', '|', '~', '`', '!', '{', '}', '%', '+', '’', '«', '»', '”', '“', chr( 0 ) );
// Проверка поддержки utf8
static $utf8_pcre = null;
if ( ! isset( $utf8_pcre ) ) {
$utf8_pcre = @preg_match( '/^./u', 'a' );
}
// Если имя файла не содержит utf8-символов
if ( ! seems_utf8( $filename ) ) {
$_ext = pathinfo( $filename, PATHINFO_EXTENSION );
$_name = pathinfo( $filename, PATHINFO_FILENAME );
$filename = sanitize_title_with_dashes( $_name ) . '.' . $_ext;
}
// Заменяем неразрывные пробелы
if ( $utf8_pcre ) {
$filename = preg_replace( "#x{00a0}#siu", ' ', $filename );
}
// Применяем фильтры для удаления специальных символов
$special_chars = apply_filters( 'sanitize_file_name_chars', $special_chars, $filename_raw );
$filename = str_replace( $special_chars, '', $filename );
$filename = str_replace( array( '%20', '+' ), '-', $filename );
$filename = preg_replace( '/.{2,}/', '.', $filename );
$filename = preg_replace( '/[rnt -]+/', '-', $filename );
$filename = trim( $filename, '.-_' );
// Проверка на наличие точки
if ( ! str_contains( $filename, '.' ) ) {
$mime_types = wp_get_mime_types();
$filetype = wp_check_filetype( 'test.' . $filename, $mime_types );
if ( $filetype['ext'] === $filename ) {
$filename = 'unnamed-file.' . $filetype['ext'];
}
}
// Разделение имени файла на основу и расширение
$parts = explode( '.', $filename );
// Возвращаем, если только одно расширение
if ( count( $parts ) <= 2 ) {
return apply_filters( 'sanitize_file_name', $filename, $filename_raw );
}
// Обработка нескольких расширений
$filename = array_shift( $parts );
$extension = array_pop( $parts );
$mimes = get_allowed_mime_types();
// Проверка промежуточных расширений
foreach ( (array) $parts as $part ) {
$filename .= '.' . $part;
if ( preg_match( '/^[a-zA-Z]{2,5}d?$/', $part ) ) {
$allowed = false;
foreach ( $mimes as $ext_preg => $mime_match ) {
$ext_preg = '!^(' . $ext_preg . ')$!i';
if ( preg_match( $ext_preg, $part ) ) {
$allowed = true;
break;
}
}
if ( ! $allowed ) {
$filename .= '_';
}
}
}
$filename .= '.' . $extension;
return apply_filters( 'sanitize_file_name', $filename, $filename_raw );
}
Заключение
Функция sanitize_file_name() полезна для подготовки имен файлов к загрузке в WordPress. Она помогает избежать ошибок, связанных с недопустимыми символами, и обеспечивает удобочитаемость имен файлов. Используйте её для повышения качества и безопасности ваших загружаемых файлов.