WP_HTML_Decoder::attribute_starts_with( string $haystack, string $search_text, string $case_sensitivity = 'case-sensitive' ): bool

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

Description

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' );

Parameters

$haystackstringrequired
String containing the raw non-decoded attribute value.
$search_textstringrequired
Does the attribute value start with this plain string.
$case_sensitivitystringoptional
Pass 'ascii-case-insensitive' to ignore ASCII case when matching.
Default 'case-sensitive'.

Default:'case-sensitive'

Return

bool Whether the attribute value starts with the given string.

Source

public static function attribute_starts_with( $haystack, $search_text, $case_sensitivity = 'case-sensitive' ): bool {
	$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;
}

Changelog

VersionDescription
6.6.0Introduced.

User Contributed Notes

You must log in before being able to contribute a note or feedback.