WordPress Version: 6.5
/**
* Retrieves all attributes from the shortcodes tag.
*
* The attributes list has the attribute name as the key and the value of the
* attribute as the value in the key/value pair. This allows for easier
* retrieval of the attributes, since all attributes have to be known.
*
* @since 2.5.0
* @since 6.5.0 The function now always returns an empty array,
* even if the original arguments string cannot be parsed or is empty.
*
* @param string $text Shortcode arguments list.
* @return array Array of attribute values keyed by attribute name.
* Returns empty array if there are no attributes
* or if the original arguments string cannot be parsed.
*/
function shortcode_parse_atts($text)
{
$atts = array();
$pattern = get_shortcode_atts_regex();
$text = preg_replace("/[\\x{00a0}\\x{200b}]+/u", ' ', $text);
if (preg_match_all($pattern, $text, $match, PREG_SET_ORDER)) {
foreach ($match as $m) {
if (!empty($m[1])) {
$atts[strtolower($m[1])] = stripcslashes($m[2]);
} elseif (!empty($m[3])) {
$atts[strtolower($m[3])] = stripcslashes($m[4]);
} elseif (!empty($m[5])) {
$atts[strtolower($m[5])] = stripcslashes($m[6]);
} elseif (isset($m[7]) && strlen($m[7])) {
$atts[] = stripcslashes($m[7]);
} elseif (isset($m[8]) && strlen($m[8])) {
$atts[] = stripcslashes($m[8]);
} elseif (isset($m[9])) {
$atts[] = stripcslashes($m[9]);
}
}
// Reject any unclosed HTML elements.
foreach ($atts as &$value) {
if (str_contains($value, '<')) {
if (1 !== preg_match('/^[^<]*+(?:<[^>]*+>[^<]*+)*+$/', $value)) {
$value = '';
}
}
}
}
return $atts;
}