sanitize_file_name() WP 2.1.0

Очищає назву файлу, замінюючи пробіли на ‘_’ та видаляючи неприпустимі символи тощо.

Замінює: пробіли на _, кілька тире на одне, видаляє точки, тире, підкреслення (. – _) на кінцях назви, а також видаляє різні символи:? [ ] / = <> : ; ' & $ # * ( ) | ~ ` ! { }

1 раз – 0.000031 сек
(дуже швидко) | 50000 разів – 0.38 сек
(дуже швидко)

Хуки з функції

Повертає

Строку. Очищена назва файлу.

Використання

sanitize_file_name($filename);
$filename
(рядок) (обов’язковий)
Назва файлу, який потрібно очистити.

Приклади

0

#1 Очистимо назву файла, перед завантаженням на сервер.

Для цього пропустимо його через фільтр:

$filename = '__my--file-&-name-<->;.jpg';
$filename = sanitize_file_name($filename); //> my-file-name-.jpg

список змін

З версії 2.1.0Введено.

Код sanitize_file_name() WP 6.0.2

function sanitize_file_name( $filename ) {
	$filename_raw = $filename;
	$ filename = remove_accents ( $ filename );

	$special_chars = array( '?', '[', ']', '/', '', '=', '<', '>', ':', ';', ',', "'", '"', '&', '$', '#', '*', '(', ')', '|', '~', ''', '!', '{ ', '}', '%', '+', ''', '«', '»', '”', '“', chr( 0 ) );

	// Check for support for utf8 ininstalled PCRE library once and store the result in a static.
	static $utf8_pcre = null;
	if ( ! isset( $utf8_pcre ) ) {
		// phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
		$utf8_pcre = @preg_match( '/^./u', 'a' );
	}

	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 );
	}

	/**
	 * Filters List of characters to remove from a filename.
	 *
	 * @ Since 2.8.0
	 *
	 * @param string[] $special_chars Array of characters to remove.
	 * @param string $filename_raw Оригінальний filename to be sanitized.
	 */
	$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( '/[rnt -]+/', '-', $filename );
	$filename = trim($filename, '.-_');

	if ( false === strpos( $filename, '.' ) ) {
		$mime_types = wp_get_mime_types();
		$filetype = wp_check_filetype( 'test.' . $filename, $mime_types );
		if ( $filetype['ext'] === $filename ) {
			$filename = 'unnamed-file.' . $filetype['ext'];
		}
	}

	// Split filename в основу і довжину [s].
	$parts = explode('.', $filename);

	// Return if only one extension.
	if ( count( $parts ) <= 2 ) {
		/** Цей filter is documented в wp-includes/formatting.php */
		return apply_filters( 'sanitize_file_name', $filename, $filename_raw );
	}

	// Process multiple extensions.
	$ filename = array_shift ( $ parts );
	$ extension = array_pop ( $ parts );
	$mimes = get_allowed_mime_types();

	/*
	 * Loop over any intermediate extensions. Postfix them with a trailing underscore
	 * якщо вони є 2 - 5 характером довгий alpha string не в доповненому extension list.
	 */
	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;

	/**
	 * Filters a sanitized filename string.
	 *
	 * @ Since 2.8.0
	 *
	 * @param string $filename Sanitized filename.
	 * @param string $filename_raw filename prior to sanitization.
	 */
	return apply_filters( 'sanitize_file_name', $filename, $filename_raw );
}