diff --git src/wp-includes/shortcodes.php src/wp-includes/shortcodes.php
index b2aad3d..d85dbd3 100644
--- src/wp-includes/shortcodes.php
+++ src/wp-includes/shortcodes.php
@@ -579,13 +579,15 @@ function shortcode_atts( $pairs, $atts, $shortcode = '' ) {
  * Remove all shortcode tags from the given content.
  *
  * @since 2.5.0
+ * @since 4.7.0 The `$tag_array` parameter was introduced.
  *
  * @global array $shortcode_tags
  *
- * @param string $content Content to remove shortcode tags.
+ * @param string $content   Content to remove shortcode tags.
+ * @param array  $tag_array Optional. Array of shortcode tags to remove. Default all tags.
  * @return string Content without shortcode tags.
  */
-function strip_shortcodes( $content ) {
+function strip_shortcodes( $content, $tag_array = array() ) {
 	global $shortcode_tags;
 
 	if ( false === strpos( $content, '[' ) ) {
@@ -597,7 +599,11 @@ function strip_shortcodes( $content ) {
 
 	// Find all registered tag names in $content.
 	preg_match_all( '@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches );
-	$tagnames = array_intersect( array_keys( $shortcode_tags ), $matches[1] );
+
+	// If $tag_array is set, then use this instead of the global.
+	$tags_to_remove = empty( $tag_array ) ? array_keys( $shortcode_tags ) : $tag_array;
+
+	$tagnames = array_intersect( $tags_to_remove, $matches[1] );
 
 	if ( empty( $tagnames ) ) {
 		return $content;
diff --git tests/phpunit/tests/shortcode.php tests/phpunit/tests/shortcode.php
index f5e8ae2..e86693e 100644
--- tests/phpunit/tests/shortcode.php
+++ tests/phpunit/tests/shortcode.php
@@ -340,16 +340,37 @@ EOF;
 		$this->assertEquals( $test_string, shortcode_unautop( wpautop( $test_string ) ) );
 	}
 
+	function data_test_strip_shortcodes() {
+		return array(
+			array( 'before', 'before[gallery]', array() ),
+			array( 'after', '[gallery]after', array() ),
+			array( 'beforeafter', 'before[gallery]after', array() ),
+			array( 'before[after', 'before[after', array() ),
+			array( 'beforeafter', 'beforeafter', array() ),
+			array( 'beforeafter', 'before[gallery id="123" size="medium"]after', array() ),
+			array( 'before[unregistered_shortcode]after', 'before[unregistered_shortcode]after', array() ),
+			array( 'beforeafter', 'before[footag]after', array() ),
+			array( 'before  after', 'before [footag]content[/footag] after', array() ),
+			array( 'before  after', 'before [footag foo="123"]content[/footag] after', array() ),
+			array( 'before after', '[gallery]before [footag]after', array( 'gallery', 'footag' ) ),
+			array( 'before [footag]after', '[gallery]before [footag]after', array( 'gallery' ) ),
+		);
+	}
+
 	/**
 	 * @ticket 10326
+	 * @ticket 37767
+	 *
+	 * @dataProvider data_test_strip_shortcodes
+	 *
+	 * @param string $expected  Expected output.
+	 * @param string $content   Content to run strip_shortcodes() on.
+	 * @param array  $tag_array The specific tags to remove.
 	 */
-	function test_strip_shortcodes() {
-		$this->assertEquals('before', strip_shortcodes('before[gallery]'));
-		$this->assertEquals('after', strip_shortcodes('[gallery]after'));
-		$this->assertEquals('beforeafter', strip_shortcodes('before[gallery]after'));
+	function test_strip_shortcodes( $expected, $content, $tag_array ) {
+		$this->assertEquals( $expected, strip_shortcodes( $content, $tag_array ) );
 	}
 
-
 	// Store passed in shortcode_atts_{$shortcode} args
 	function _filter_atts( $out, $pairs, $atts ) {
 		$this->filter_atts_out = $out;
