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
$haystack
stringrequired- String containing the raw non-decoded attribute value.
$search_text
stringrequired- Does the attribute value start with this plain string.
$case_sensitivity
stringoptional- Pass
'ascii-case-insensitive'
to ignore ASCII case when matching.
Default'case-sensitive'
.Default:
'case-sensitive'
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
Version | Description |
---|---|
6.6.0 | Introduced. |
User Contributed Notes
You must log in before being able to contribute a note or feedback.