wp_kses_hair()WP 1.0.0

Получает список атрибутов html тега (в виде массива) из переданной строки с атрибутами.

Эта функция делает много работы. Кроме того, что она обрабатывает строку и создает из нее массив данных находящихся в ней атрибутов, она дополняет кавычки, если они не указаны в атрибутах. Также, она удаляет неуказанные, а значит запрещенные протоколы (http) из значений атрибута, если это УРЛ. Также, она убирает одинаковые атрибуты, пусть было: foo=bar foo=baz станет foo="bar".

Несмотря на то, что функция относится к функциям очистки (kses), её удобно использовать в плагинах, когда нужно обработать атрибуты тега, такое не редко нужно.

1 раз — 0.000145 сек (быстро) | 50000 раз — 2.85 сек (быстро)

Хуков нет.

Возвращает

Массив<Строку,. Список полученных атрибутов в виде массива описывающего каждый атрибут. Или пустой массив, если не удалось ничего получить.

Использование

wp_kses_hair( $attr, $allowed_protocols );
$attr(строка) (обязательный)
Атрибуты html тега, прям как они указаны в атрибуте. Множественные пробелы игнорируются.
$allowed_protocols(массив) (обязательный)
Допустимые протоколы, которые нужно сохранить, если в значениях атрибутов есть УРЛ.

Примеры

0

#1 Демонстрация работы

$attrs = wp_kses_hair(' src="http://example.com/jpg.jpg"   alt="aaaaa"   foo=bar', 'http');

/*
$attrs будет содержать:

Array
(
	[src] => Array
		(
			[name] => src
			[value] => http://example.com/jpg.jpg
			[whole] => src="http://example.com/jpg.jpg"
			[vless] => n
		)

	[alt] => Array
		(
			[name] => alt
			[value] => aaaaa
			[whole] => alt="aaaaa"
			[vless] => n
		)

	[foo] => Array
		(
			[name] => foo
			[value] => bar
			[whole] => foo="bar"
			[vless] => n
		)

)
*/
0

#2 Протокол, который отличается от значения атрибута

Если указать протокол, который будет отличаться, то функция просто удалить протокол оставив УРЛ относительным:

$attrs = wp_kses_hair('src=http://example.com/jpg.jpg', 'https');

/*
Получим:

Array
(
	[src] => Array
		(
			[name] => src
			[value] => //example.com/jpg.jpg
			[whole] => src="//example.com/jpg.jpg"
			[vless] => n
		)

)

*/

Список изменений

С версии 1.0.0 Введена.
С версии 7.0.0 Reliably parses HTML via the HTML API.

Код wp_kses_hair() WP 7.0

function wp_kses_hair( $attr, $allowed_protocols ) {
	$attributes = array();
	$uris       = wp_kses_uri_attributes();

	$processor = new WP_HTML_Tag_Processor( "<wp {$attr}>" );
	$processor->next_token();

	$attribute_names = $processor->get_attribute_names_with_prefix( '' );
	if ( null === $attribute_names || 0 === count( $attribute_names ) ) {
		return $attributes;
	}

	$syntax_characters = array(
		'&' => '&amp;',
		'<' => '&lt;',
		'>' => '&gt;',
		"'" => '&apos;',
		'"' => '&quot;',
	);

	foreach ( $attribute_names as $name ) {
		$value   = $processor->get_attribute( $name );
		$is_bool = true === $value;
		if ( is_string( $value ) && in_array( $name, $uris, true ) ) {
			$value = wp_kses_bad_protocol( $value, $allowed_protocols );
		}

		// Reconstruct and normalize the attribute value.
		$recoded = $is_bool ? '' : strtr( $value, $syntax_characters );
		$whole   = $is_bool ? $name : "{$name}=\"{$recoded}\"";

		$attributes[ $name ] = array(
			'name'  => $name,
			'value' => $recoded,
			'whole' => $whole,
			'vless' => $is_bool ? 'y' : 'n',
		);
	}

	return $attributes;
}