WP_HTML_Tag_Processor::skip_rcdata()privateWP 6.2.0

Skips contents of RCDATA elements, namely title and textarea tags.

Метод класса: WP_HTML_Tag_Processor{}

Хуков нет.

Возвращает

true|false. Whether an end to the RCDATA region was found before the end of the document.

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

// private - только в коде основоного (родительского) класса
$result = $this->skip_rcdata( $tag_name );
$tag_name(строка) (обязательный)
The uppercase tag name which will close the RCDATA region.

Заметки

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

С версии 6.2.0 Введена.

Код WP_HTML_Tag_Processor::skip_rcdata() WP 6.6.1

private function skip_rcdata( $tag_name ) {
	$html       = $this->html;
	$doc_length = strlen( $html );
	$tag_length = strlen( $tag_name );

	$at = $this->bytes_already_parsed;

	while ( false !== $at && $at < $doc_length ) {
		$at                       = strpos( $this->html, '</', $at );
		$this->tag_name_starts_at = $at;

		// Fail if there is no possible tag closer.
		if ( false === $at || ( $at + $tag_length ) >= $doc_length ) {
			return false;
		}

		$at += 2;

		/*
		 * Find a case-insensitive match to the tag name.
		 *
		 * Because tag names are limited to US-ASCII there is no
		 * need to perform any kind of Unicode normalization when
		 * comparing; any character which could be impacted by such
		 * normalization could not be part of a tag name.
		 */
		for ( $i = 0; $i < $tag_length; $i++ ) {
			$tag_char  = $tag_name[ $i ];
			$html_char = $html[ $at + $i ];

			if ( $html_char !== $tag_char && strtoupper( $html_char ) !== $tag_char ) {
				$at += $i;
				continue 2;
			}
		}

		$at                        += $tag_length;
		$this->bytes_already_parsed = $at;

		if ( $at >= strlen( $html ) ) {
			return false;
		}

		/*
		 * Ensure that the tag name terminates to avoid matching on
		 * substrings of a longer tag name. For example, the sequence
		 * "</textarearug" should not match for "</textarea" even
		 * though "textarea" is found within the text.
		 */
		$c = $html[ $at ];
		if ( ' ' !== $c && "\t" !== $c && "\r" !== $c && "\n" !== $c && '/' !== $c && '>' !== $c ) {
			continue;
		}

		while ( $this->parse_next_attribute() ) {
			continue;
		}

		$at = $this->bytes_already_parsed;
		if ( $at >= strlen( $this->html ) ) {
			return false;
		}

		if ( '>' === $html[ $at ] ) {
			$this->bytes_already_parsed = $at + 1;
			return true;
		}

		if ( $at + 1 >= strlen( $this->html ) ) {
			return false;
		}

		if ( '/' === $html[ $at ] && '>' === $html[ $at + 1 ] ) {
			$this->bytes_already_parsed = $at + 2;
			return true;
		}
	}

	return false;
}