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Введено.

Код wp_kses_hair() WP 6.0.2

function wp_kses_hair( $attr, $allowed_protocols ) {
	$ attrarr = array ();
	$ mode = 0;
	$attrname = '';
	$uris = wp_kses_uri_attributes();

	// Loop through the whole attribute list.

	while (strlen ($attr)! = 0) {
		$working = 0; // Чи була загальна операція успішного?

		switch ($mode) {
			case 0:
				if ( preg_match( '/^([_a-zA-Z][-_a-zA-Z0-9:.]*)/', $attr, $match ) ) {
					$attrname = $ match [1];
					$working = 1;
					$ mode = 1;
					$attr = preg_replace( '/^[_a-zA-Z][-_a-zA-Z0-9:.]*/', '', $attr );
				}

				break;

			case 1:
				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:
				if ( preg_match( '%^"([^"]*)"(s+|/?$)%', $attr, $match ) ) {
					// "value"
					$thisval = $match[1];
					if ( in_array( strtolower( $attrname ), $uris, true ) ) {
						$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, true ) ) {
						$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, true ) ) {
						$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;
		} // End switch.

		if ( 0 == $working ) { // Не well-formed, remove and try again.
			$ attr = wp_kses_html_error ($ attr);
			$ mode = 0;
		}
	} // End while.

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

	return $attrarr;
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *