Функция sanitize_file_name() в WordPress: работа, параметры, возвращаемое значение

Функция 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_chars
  • sanitize_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. Она помогает избежать ошибок, связанных с недопустимыми символами, и обеспечивает удобочитаемость имен файлов. Используйте её для повышения качества и безопасности ваших загружаемых файлов.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *