WordPress как на ладони
wordpress jino

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(массив) (обязательный)
Допустимые протоколы, которые нужно сохранить, если в значениях атрибутов есть УРЛ.

Примеры

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

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

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

Array
(
	[src] => Array
		(
			[name] => src
			[value] => http://site.ru/jpg.jpg
			[whole] => src="http://site.ru/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
		)

)
*/

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

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

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

/*
Получим:

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

)

*/

Код wp kses hair: wp-includes/kses.php WP 4.8.2

<?php
function wp_kses_hair($attr, $allowed_protocols) {
	$attrarr = array();
	$mode = 0;
	$attrname = '';
	$uris = array('xmlns', 'profile', 'href', 'src', 'cite', 'classid', 'codebase', 'data', 'usemap', 'longdesc', 'action');

	// Loop through the whole attribute list

	while (strlen($attr) != 0) {
		$working = 0; // Was the last operation successful?

		switch ($mode) {
			case 0 : // attribute name, href for instance

				if ( preg_match('/^([-a-zA-Z:]+)/', $attr, $match ) ) {
					$attrname = $match[1];
					$working = $mode = 1;
					$attr = preg_replace( '/^[-a-zA-Z:]+/', '', $attr );
				}

				break;

			case 1 : // equals sign or valueless ("selected")

				if (preg_match('/^\s*=\s*/', $attr)) // equals sign
					{
					$working = 1;
					$mode = 2;
					$attr = preg_replace('/^\s*=\s*/', '', $attr);
					break;
				}

				if (preg_match('/^\s+/', $attr)) // valueless
					{
					$working = 1;
					$mode = 0;
					if(false === array_key_exists($attrname, $attrarr)) {
						$attrarr[$attrname] = array ('name' => $attrname, 'value' => '', 'whole' => $attrname, 'vless' => 'y');
					}
					$attr = preg_replace('/^\s+/', '', $attr);
				}

				break;

			case 2 : // attribute value, a URL after href= for instance

				if (preg_match('%^"([^"]*)"(\s+|/?$)%', $attr, $match))
					// "value"
					{
					$thisval = $match[1];
					if ( in_array(strtolower($attrname), $uris) )
						$thisval = wp_kses_bad_protocol($thisval, $allowed_protocols);

					if(false === array_key_exists($attrname, $attrarr)) {
						$attrarr[$attrname] = array ('name' => $attrname, 'value' => $thisval, 'whole' => "$attrname=\"$thisval\"", 'vless' => 'n');
					}
					$working = 1;
					$mode = 0;
					$attr = preg_replace('/^"[^"]*"(\s+|$)/', '', $attr);
					break;
				}

				if (preg_match("%^'([^']*)'(\s+|/?$)%", $attr, $match))
					// 'value'
					{
					$thisval = $match[1];
					if ( in_array(strtolower($attrname), $uris) )
						$thisval = wp_kses_bad_protocol($thisval, $allowed_protocols);

					if(false === array_key_exists($attrname, $attrarr)) {
						$attrarr[$attrname] = array ('name' => $attrname, 'value' => $thisval, 'whole' => "$attrname='$thisval'", 'vless' => 'n');
					}
					$working = 1;
					$mode = 0;
					$attr = preg_replace("/^'[^']*'(\s+|$)/", '', $attr);
					break;
				}

				if (preg_match("%^([^\s\"']+)(\s+|/?$)%", $attr, $match))
					// value
					{
					$thisval = $match[1];
					if ( in_array(strtolower($attrname), $uris) )
						$thisval = wp_kses_bad_protocol($thisval, $allowed_protocols);

					if(false === array_key_exists($attrname, $attrarr)) {
						$attrarr[$attrname] = array ('name' => $attrname, 'value' => $thisval, 'whole' => "$attrname=\"$thisval\"", 'vless' => 'n');
					}
					// We add quotes to conform to W3C's HTML spec.
					$working = 1;
					$mode = 0;
					$attr = preg_replace("%^[^\s\"']+(\s+|$)%", '', $attr);
				}

				break;
		} // switch

		if ($working == 0) // not well formed, remove and try again
		{
			$attr = wp_kses_html_error($attr);
			$mode = 0;
		}
	} // while

	if ($mode == 1 && false === array_key_exists($attrname, $attrarr))
		// special case, for when the attribute list ends with a valueless
		// attribute like "selected"
		$attrarr[$attrname] = array ('name' => $attrname, 'value' => '', 'whole' => $attrname, 'vless' => 'y');

	return $attrarr;
}

Cвязанные функции

Из метки: kses (очистка html)

Еще из раздела: Вспомогательные

wp_kses_hair Комментариев нет

Здравствуйте, !

Ваш комментарий