Index: src/wp-includes/shortcodes.php
===================================================================
--- src/wp-includes/shortcodes.php	(revision 45785)
+++ src/wp-includes/shortcodes.php	(working copy)
@@ -488,8 +488,9 @@
  * retrieval of the attributes, since all attributes have to be known.
  *
  * @since 2.5.0
+ * @since 5.3.0 Support of a full shortcode input.
  *
- * @param string $text
+ * @param string $text  Any single shortcode of any format or key/value pair string.
  * @return array|string List of attribute values.
  *                      Returns empty array if trim( $text ) == '""'.
  *                      Returns empty string if trim( $text ) == ''.
@@ -498,7 +499,17 @@
 function shortcode_parse_atts( $text ) {
 	$atts    = array();
 	$pattern = get_shortcode_atts_regex();
-	$text    = preg_replace( "/[\x{00a0}\x{200b}]+/u", ' ', $text );
+	$text    = trim( preg_replace( "/[\x{00a0}\x{200b}]+/u", ' ', $text ) );
+
+	// Remove everything but attributes from shortcode.
+	if ( preg_match( '/^\[[\w-]+([^\]]*)\]/', $text, $matches ) ) {
+		if ( count( $matches ) === 2 ) {
+			$text = $matches[1];
+			$text = preg_replace( "/\/$/", '', $text );
+			$text = trim( $text );
+		}
+	}
+
 	if ( preg_match_all( $pattern, $text, $match, PREG_SET_ORDER ) ) {
 		foreach ( $match as $m ) {
 			if ( ! empty( $m[1] ) ) {
@@ -516,7 +527,7 @@
 			}
 		}
 
-		// Reject any unclosed HTML elements
+		// Reject any unclosed HTML elements.
 		foreach ( $atts as &$value ) {
 			if ( false !== strpos( $value, '<' ) ) {
 				if ( 1 !== preg_match( '/^[^<]*+(?:<[^>]*+>[^<]*+)*+$/', $value ) ) {
@@ -527,6 +538,7 @@
 	} else {
 		$atts = ltrim( $text );
 	}
+
 	return $atts;
 }
 
Index: tests/phpunit/tests/shortcode.php
===================================================================
--- tests/phpunit/tests/shortcode.php	(revision 45785)
+++ tests/phpunit/tests/shortcode.php	(working copy)
@@ -972,4 +972,129 @@
 		);
 		$this->assertEquals( 'test-shortcode-tag', $this->tagname );
 	}
+
+	/**
+	 * Testing the `shortcode_parse_atts()` function.
+	 *
+	 * @ticket 47863
+	 *
+	 * @covers ::shortcode_parse_atts
+	 * @dataProvider data_shortcode_parse_atts
+	 *
+	 * @param string       $text     A single shortcode format or key/value pair string.
+	 * @param string|array $expected Expected results.
+	 */
+	public function test_shortcode_parse_atts( $text, $expected ) {
+		$actual = shortcode_parse_atts( $text );
+		$this->assertSame( $expected, $actual );
+	}
+
+	/**
+	 * Data provider for `test_shortcode_parse_atts()`.
+	 *
+	 * @return array {
+	 *     @type array {
+	 *         @type string       $text     A single shortcode format or key/value pair string.
+	 *         @type string|array $expected The expected result.
+	 *     }
+	 * }
+	 */
+	public function data_shortcode_parse_atts() {
+
+		return array(
+			array(
+				'',
+				'',
+			),
+			array(
+				'	',
+				'',
+			),
+			array(
+				'""',
+				array(),
+			),
+			array(
+				'\'\'',
+				array(),
+			),
+			array(
+				'[unittest]',
+				'',
+			),
+			array(
+				'[unitest]Unit Test[/unittest]',
+				'',
+			),
+			array(
+				'[unittest title="unittest" link="https://unit.test/"]',
+				array(
+					'title' => 'unittest',
+					'link'  => 'https://unit.test/',
+				),
+			),
+			array(
+				'[unittest title="unittest" link="https://unit.test/"/]',
+				array(
+					'title' => 'unittest',
+					'link'  => 'https://unit.test/',
+				),
+			),
+			array(
+				'[unit_test title="unittest" link="https://unit.test/"/]',
+				array(
+					'title' => 'unittest',
+					'link'  => 'https://unit.test/',
+				),
+			),
+			array(
+				'[unit-test title="unittest" link="https://unit.test/"/]',
+				array(
+					'title' => 'unittest',
+					'link'  => 'https://unit.test/',
+				),
+			),
+			array(
+				'[unittest link=https://unit.test/ /]',
+				array(
+					'link'  => 'https://unit.test/',
+				),
+			),
+			array(
+				'[unittest link=https://unit.test/ ]',
+				array(
+					'link'  => 'https://unit.test/',
+				),
+			),
+			array(
+				'[unittest link=https://unit.test/]',
+				array(
+					'link'  => 'https://unit.test',
+				),
+			),
+			array(
+				'[unittest link https://unit.test/ /]',
+				array(
+					'link',
+					'https://unit.test/',
+				),
+			),
+			array(
+				'[unittest title="unittest" link="https://unit.test/"]Unit Test[/unittest]',
+				array(
+					'title' => 'unittest',
+					'link'  => 'https://unit.test/',
+				),
+			),
+			array(
+				'title="unittest" link="https://unit.test/"',
+				array(
+					'title' => 'unittest',
+					'link'  => 'https://unit.test/',
+				),
+			),
+		);
+
+	}
+
 }
