WP_HTML_Decoder::attribute_starts_with()public staticWP 6.6.0

Indicates if an attribute value starts with a given raw string value.

Use this method to determine if an attribute value starts with a given string, regardless of how it might be encoded in HTML. For instance, http: could be represented as http: or as http: or as http: or as http:, or in many other ways.

Example:

$value = 'http://wordpress.org/';
true   === WP_HTML_Decoder::attribute_starts_with( $value, 'http:', 'ascii-case-insensitive' );
false  === WP_HTML_Decoder::attribute_starts_with( $value, 'https:', 'ascii-case-insensitive' );

Method of the class: WP_HTML_Decoder{}

No Hooks.

Return

true|false. Whether the attribute value starts with the given string.

Usage

$result = WP_HTML_Decoder::attribute_starts_with( $haystack, $search_text, $case_sensitivity );
$haystack(string) (required)
String containing the raw non-decoded attribute value.
$search_text(string) (required)
Does the attribute value start with this plain string.
$case_sensitivity(string)
Pass 'ascii-case-insensitive' to ignore ASCII case when matching.
Default: 'case-sensitive'

Changelog

Since 6.6.0 Introduced.

WP_HTML_Decoder::attribute_starts_with() code WP 6.6.2

public static function attribute_starts_with( $haystack, $search_text, $case_sensitivity = 'case-sensitive' ) {
	$search_length = strlen( $search_text );
	$loose_case    = 'ascii-case-insensitive' === $case_sensitivity;
	$haystack_end  = strlen( $haystack );
	$search_at     = 0;
	$haystack_at   = 0;

	while ( $search_at < $search_length && $haystack_at < $haystack_end ) {
		$chars_match = $loose_case
			? strtolower( $haystack[ $haystack_at ] ) === strtolower( $search_text[ $search_at ] )
			: $haystack[ $haystack_at ] === $search_text[ $search_at ];

		$is_introducer = '&' === $haystack[ $haystack_at ];
		$next_chunk    = $is_introducer
			? self::read_character_reference( 'attribute', $haystack, $haystack_at, $token_length )
			: null;

		// If there's no character reference and the characters don't match, the match fails.
		if ( null === $next_chunk && ! $chars_match ) {
			return false;
		}

		// If there's no character reference but the character do match, then it could still match.
		if ( null === $next_chunk && $chars_match ) {
			++$haystack_at;
			++$search_at;
			continue;
		}

		// If there is a character reference, then the decoded value must exactly match what follows in the search string.
		if ( 0 !== substr_compare( $search_text, $next_chunk, $search_at, strlen( $next_chunk ), $loose_case ) ) {
			return false;
		}

		// The character reference matched, so continue checking.
		$haystack_at += $token_length;
		$search_at   += strlen( $next_chunk );
	}

	return true;
}