esc_url() WP 2.8.0

Очищає УРЛ для використання в тексті, змінює неправильні та видаляє небезпечні символи.

Ця функція, на відміну від esc_url_raw(), готує рядок до виведення на екран.

Завжди використовуйте цю функцію, коли потрібно очистити УРЛи, наприклад, у тексті, атрибутах HTML тегів або деінде.

Функція створює символи як HTML сутностей. Змінює амперсанд &і лапку , 'з їхньої сутності &,.'

Уникайте УРЛів, у яких використовується потрібний протокол, тобто. УРЛ повинен починатися з одного з: http , https , ftp , ftps , mailto , news , irc , gopher , nntp , feed , telnet .

Основа для:
esc_url_raw()
1 раз – 0.000052 сек
(дуже швидко) | 50000 разів – 0.31 сек
(дуже швидко) |
PHP 7.1.2, WP 4.7.3

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

Повертає

Строку. Очищений УРЛ.

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

$url = esc_url($url, $protocols, $_context);
$url
(рядок) (обов’язковий)
УРЛ, який потрібно очистити.
$protocols
(масив)
Масив протоколів, що приймаються. За замовчуванням це:
http ,
https ,
ftp ,
ftps ,
mailto ,
news ,
irc ,
gopher ,
nntp ,
feed ,
telnet .


Типово: null
$_context
(рядок)

Як використовуватиметься УРЛ. Може бути:

  • display– амперсанд ( & ) і лапки ( ), будуть замінені з їхньої сутності.
  • ''(Порожній рядок) – стандартне очищення.
  • db– стандартне очищення.

Типово: ‘display’

Приклади

0

#1 Демонстрація очищення URL

echo esc_url("http://example.com/link?var='some&");
// http://example.com/link?var='some&

echo esc_url( 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAD////////neHiwAAAAF3RST/+8RwZ==' );
// '' - порожня стрічка
0

#2 Відносний URL

echo esc_url('/foo'); //> /foo

// АЛЕ
echo esc_url('foo'); //> http://foo
0

#3 Порівняння з urlencode()

  • urlencode()– кодує відданий рядок, щоб його можна було використовувати як частину URL (без домену). Якщо передати повністю URL, він стане неробочим.

  • esc_url()– обробляє URL повністю (не ламає його), піклується про безпечному виведенні URL на екран – видаляє або змінює URL деякі символи (зовсім не так як це робить urlencode()).
$url = "http://example.com/моє посилання?var='some&";

echo esc_url($url); // http://example.com/моє%20посилання?var='some&
echo urlencode ($ url); // http%3A%2F%2Fexample.com%2F%D0%BC%D0%BE%D1%8F+%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0% 3Fvar%3D%27some%26

список змін

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

код esc_url() WP 6.0.2

function esc_url( $url, $protocols = null, $_context = 'display' ) {
	$original_url = $url;

	if ( '' === $url ) {
		return $url;
	}

	$url = str_replace( ' ', '%20', ltrim( $url ) );
	$url = preg_replace( '|[^a-z0-9-~+_.?#=!&;,/:%@$|*'()[]x80-xff] |i', '', $url);

	if ( '' === $url ) {
		return $url;
	}

	if ( 0 !== stripos( $url, 'mailto:' ) ) {
		$strip = array( '%0d', '%0a', '%0D', '%0A');
		$url = _deep_replace( $strip, $url );
	}

	$url = str_replace( ';//', '://', ​​$url );
	/*
	 * Якщо URL не appear to contain a scheme, we presume
	 * it needs http:// prepended (unless it's a relative link
	 * starting with /, # or?, or a PHP file).
	 */
	if ( strpos( $url, ':' ) === false && ! in_array( $url[0], array( '/', '#', '?' ), true ) &&
		! preg_match( '/^[a-z0-9-]+?.php/i', $url ) ) {
		$url = 'http://'. $url;
	}

	// Replace ampersands and single quotes тільки коли displaying.
	if ( 'display' === $_context ) {
		$url = wp_kses_normalize_entities( $url );
		$url = str_replace( '&', '&', $url );
		$url = str_replace( "'", ''', $url );
	}

	if ( ( false !== strpos( $url, '[' ) ) || ( false !== strpos( $url, ']' ) ) ) {

		$parsed = wp_parse_url($url);
		$front = '';

		if ( isset( $parsed['scheme'] ) ) {
			$front .= $parsed['scheme'] . '://';
		} elseif ( '/' === $url[0] ) {
			$front. = '//';
		}

		if ( isset( $parsed['user'] ) ) {
			$front .= $parsed['user'];
		}

		if ( isset( $parsed['pass'] ) ) {
			$front .= ':' . $parsed['pass'];
		}

		if ( isset( $parsed['user'] ) || isset( $parsed['pass'] ) ) {
			$front. = '@';
		}

		if ( isset( $parsed['host'] ) ) {
			$front .= $parsed['host'];
		}

		if ( isset( $parsed['port'] ) ) {
			$front .= ':' . $parsed['port'];
		}

		$end_dirty = str_replace( $front, '', $url );
		$end_clean = str_replace( array( '[', ']' ), array( '%5B', '%5D' ), $end_dirty );
		$url = str_replace( $end_dirty, $end_clean, $url );

	}

	if ( '/' === $url[0] ) {
		$good_protocol_url = $url;
	} else {
		if ( ! is_array( $protocols ) ) {
			$protocols = wp_allowed_protocols();
		}
		$good_protocol_url = wp_kses_bad_protocol( $url, $protocols );
		if ( strtolower( $good_protocol_url ) != strtolower( $url ) ) {
			return '';
		}
	}

	/**
	 * Filters a string cleaned and escaped for output as URL.
	 *
	 * @ Since 2.3.0
	 *
	 * @param string $good_protocol_url Натиснута URL-адреса.
	 * @param string $original_url URL-адреса для помилок.
	 * @param string $_context Якщо 'display', replace ampersands and single quotes only.
	 */
	return apply_filters( 'clean_url', $good_protocol_url, $original_url, $_context );
}