Index: wp-includes/formatting.php
===================================================================
--- wp-includes/formatting.php	(revision 9338)
+++ wp-includes/formatting.php	(working copy)
@@ -32,7 +32,7 @@
 	$has_pre_parent = false;
 	$output = '';
 	$curl = '';
-	$textarr = preg_split('/(<.*>|\[.*\])/Us', $text, -1, PREG_SPLIT_DELIM_CAPTURE);
+	$textarr = preg_split('/([<\[].*[>\]]|\[.*\])/Us', $text, -1, PREG_SPLIT_DELIM_CAPTURE);
 	$stop = count($textarr);
 
 	// if a plugin has provided an autocorrect array, use it
@@ -50,6 +50,9 @@
 	$dynamic_characters = array('/\'(\d\d(?:&#8217;|\')?s)/', '/(\s|\A|")\'/', '/(\d+)"/', '/(\d+)\'/', '/(\S)\'([^\'\s])/', '/(\s|\A)"(?!\s)/', '/"(\s|\S|\Z)/', '/\'([\s.]|\Z)/', '/(\d+)x(\d+)/');
 	$dynamic_replacements = array('&#8217;$1','$1&#8216;', '$1&#8243;', '$1&#8242;', '$1&#8217;$2', '$1&#8220;$2', '&#8221;$1', '&#8217;$1', '$1&#215;$2');
 
+	$shortcodes = array_keys($GLOBALS['shortcode_tags']);
+	$shortcoderegex = '/^\[' . implode('|', array_map('preg_quote', $shortcodes) ) . '/i';
+
 	for ( $i = 0; $i < $stop; $i++ ) {
 		$curl = $textarr[$i];
 
@@ -64,6 +67,8 @@
 			$has_pre_parent = true;
 		} elseif (strpos($curl, '</pre>') !== false) {
 			$has_pre_parent = false;
+		} elseif ( preg_match($shortcoderegex, $curl) ) {
+			$next = false;
 		} else {
 			$next = true;
 		}
