/** * Retrieve 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 * * @param string $text * @return array|string List of attribute values. * Returns empty array if trim( $text ) == '""'. * Returns empty string if trim( $text ) == ''. * All other matches are checked for not empty(). */ 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])) { $atts[] = stripcslashes($m[8]); } } // Reject any unclosed HTML elements foreach ($atts as &$value) { if (false !== strpos($value, '<')) { if (1 !== preg_match('/^[^<]*+(?:<[^>]*+>[^<]*+)*+$/', $value)) { $value = ''; } } } } else { $atts = ltrim($text); } return $atts; }
function test_php_and_js_shortcode_attribute_regexes_match() { $file = file_get_contents(ABSPATH . WPINC . '/js/shortcode.js'); $matched = preg_match('|\\s+pattern = (\\/.+\\/)g;|', $file, $matches); $php = get_shortcode_atts_regex(); $this->assertSame(1, $matched); $js = str_replace("\\'", "'", $matches[1]); $this->assertSame($php, $js); }