Index: src/wp-includes/class-wp-embed.php
===================================================================
--- src/wp-includes/class-wp-embed.php	(revision 33407)
+++ src/wp-includes/class-wp-embed.php	(working copy)
@@ -318,11 +318,18 @@
 	 * @return string Potentially modified $content.
 	 */
 	public function autoembed( $content ) {
-		// Strip newlines from all elements.
-		$content = wp_replace_in_html_tags( $content, array( "\n" => " " ) );
+		// Avoid multiline elements and comments.
+		$content = wp_html_split( $content );
+		for ( $i = 0, $c = count( $content ); $i < $c; $i += 2 ) { 
+		
+			if ( '' == $content[$i] ) continue;
 
-		// Find URLs that are on their own line.
-		return preg_replace_callback( '|^(\s*)(https?://[^\s"]+)(\s*)$|im', array( $this, 'autoembed_callback' ), $content );
+			// Find URLs that are on their own line.
+			$content[$i] = preg_replace_callback( '|^(\s*)(https?://[^\s"]+)(\s*)$|im', array( $this, 'autoembed_callback' ), $content[$i] );
+
+		}
+		
+		return implode( $content );
 	}
 
 	/**
Index: src/wp-includes/formatting.php
===================================================================
--- src/wp-includes/formatting.php	(revision 33407)
+++ src/wp-includes/formatting.php	(working copy)
@@ -596,15 +596,14 @@
 }
 
 /**
- * Replace characters or phrases within HTML elements only.
+ * Separate HTML elements and comments from the text.
  *
- * @since 4.2.3
+ * @since 4.2.4
  *
- * @param string $haystack The text which has to be formatted.
- * @param array $replace_pairs In the form array('from' => 'to', ...).
+ * @param string $input The text which has to be formatted.
  * @return string The formatted text.
  */
-function wp_replace_in_html_tags( $haystack, $replace_pairs ) {
+function wp_html_split( $input ) {
 	// Find all elements.
 	$comments =
 		  '!'           // Start of comment, after the <.
@@ -614,6 +613,15 @@
 		. ')*+'         // Loop possessively.
 		. '(?:-->)?';   // End of comment. If not found, match all input.
 
+	$cdata =
+		  '!\[CDATA\['  // Start of comment, after the <.
+		. '[^\]]*+'     // Consume non-].
+		. '(?:'         // Unroll the loop: Consume everything until ]]> is found.
+		.     '](?!]>)' // One ] not followed by end of comment.
+		.     '[^\]]*+' // Consume non-].
+		. ')*+'         // Loop possessively.
+		. '(?:]]>)?';   // End of comment. If not found, match all input.
+
 	$regex =
 		  '/('              // Capture the entire match.
 		.     '<'           // Find start of element.
@@ -620,11 +628,29 @@
 		.     '(?(?=!--)'   // Is this a comment?
 		.         $comments // Find end of comment.
 		.     '|'
-		.         '[^>]*>?' // Find end of element. If not found, match all input.
+		.         '(?(?=!\[CDATA\[)' // Is this a comment?
+		.             $cdata // Find end of comment.
+		.         '|'
+		.             '[^>]*>?' // Find end of element. If not found, match all input.
+		.         ')'
 		.     ')'
 		. ')/s';
 
-	$textarr = preg_split( $regex, $haystack, -1, PREG_SPLIT_DELIM_CAPTURE );
+	return preg_split( $regex, $input, -1, PREG_SPLIT_DELIM_CAPTURE );
+}
+
+/**
+ * Replace characters or phrases within HTML elements only.
+ *
+ * @since 4.2.3
+ *
+ * @param string $haystack The text which has to be formatted.
+ * @param array $replace_pairs In the form array('from' => 'to', ...).
+ * @return string The formatted text.
+ */
+function wp_replace_in_html_tags( $haystack, $replace_pairs ) {
+	// Find all elements.
+	$textarr = wp_html_split( $haystack );
 	$changed = false;
 
 	// Optimize when searching for one item.
