diff --git a/core/modules/filter/filter.module b/core/modules/filter/filter.module
index c781f8a200a74a3a55b665ebb931d0ddfd7552f0..fe5615f22a2d3ecf9896fec93749c7f2d26e38fe 100644
--- a/core/modules/filter/filter.module
+++ b/core/modules/filter/filter.module
@@ -701,7 +701,7 @@ function _filter_autop($text) {
   // to avoid messing up code. We look for matched pairs and allow basic
   // nesting. For example:
   // "processed <pre> ignored <script> ignored </script> ignored </pre> processed"
-  $chunks = preg_split('@(<!--.*?-->|</?(?:pre|script|style|object|iframe|!--)[^>]*>)@i', $text, -1, PREG_SPLIT_DELIM_CAPTURE);
+  $chunks = preg_split('@(<!--.*?-->|</?(?:pre|script|style|object|iframe|drupal-media|!--)[^>]*>)@i', $text, -1, PREG_SPLIT_DELIM_CAPTURE);
   // Note: PHP ensures the array consists of alternating delimiters and literals
   // and begins and ends with a literal (inserting NULL as required).
   $ignore = FALSE;
diff --git a/core/modules/filter/tests/src/Kernel/FilterKernelTest.php b/core/modules/filter/tests/src/Kernel/FilterKernelTest.php
index f9aeeb9523fb6f52ccbf34b0535ab6cbb1acd6df..735521caeb8bb4d3c7b863df80b2b7a2477964e4 100644
--- a/core/modules/filter/tests/src/Kernel/FilterKernelTest.php
+++ b/core/modules/filter/tests/src/Kernel/FilterKernelTest.php
@@ -376,6 +376,10 @@ public function testLineBreakFilter() {
       "<iframe>aaa</iframe>\n\n" => [
         "<p><iframe>aaa</iframe></p>" => FALSE,
       ],
+      // Bug 3097338, paragraphs were appearing around drupalmedia tags.
+      '<drupal-media data-caption=" " data-entity-type="media" data-entity-uuid="dbb16f97-cd11-4357-acde-cd09e19e312b"></drupal-media>' => [
+        '<p><drupal-media data-caption=" " data-entity-type="media" data-entity-uuid="dbb16f97-cd11-4357-acde-cd09e19e312b"></drupal-media></p>' => FALSE,
+      ],
     ];
     $this->assertFilteredString($filter, $tests);