Index: shortcodes.php
===================================================================
--- shortcodes.php	(revision 17610)
+++ shortcodes.php	(working copy)
@@ -224,20 +224,20 @@
  */
 function shortcode_parse_atts($text) {
 	$atts = array();
-	$pattern = '/(\w+)\s*=\s*"([^"]*)"(?:\s|$)|(\w+)\s*=\s*\'([^\']*)\'(?:\s|$)|(\w+)\s*=\s*([^\s\'"]+)(?:\s|$)|"([^"]*)"(?:\s|$)|(\S+)(?:\s|$)/';
+	$pattern = '/(\w+)\s*=\s*"(([^"]|\\\\")*[^\\\]{1})"(?:\s|$)|(\w+)\s*=\s*\'(([^\']|\\\')*[^\\\]{1})\'(?:\s|$)|(\w+)\s*=\s*([^\s]+)(?:\s|$)|"(([^"]|\\\\")*[^\\\]{1})"(?:\s|$)|(\S+)(?:\s|$)/';
 	$text = preg_replace("/[\x{00a0}\x{200b}]+/u", " ", $text);
 	if ( preg_match_all($pattern, $text, $match, PREG_SET_ORDER) ) {
 		foreach ($match as $m) {
 			if (!empty($m[1]))
 				$atts[strtolower($m[1])] = stripcslashes($m[2]);
-			elseif (!empty($m[3]))
-				$atts[strtolower($m[3])] = stripcslashes($m[4]);
-			elseif (!empty($m[5]))
-				$atts[strtolower($m[5])] = stripcslashes($m[6]);
-			elseif (isset($m[7]) and strlen($m[7]))
-				$atts[] = stripcslashes($m[7]);
-			elseif (isset($m[8]))
-				$atts[] = stripcslashes($m[8]);
+			elseif (!empty($m[4]))
+				$atts[strtolower($m[4])] = stripcslashes($m[5]);
+			elseif (!empty($m[7]))
+				$atts[strtolower($m[7])] = stripcslashes($m[8]);
+			elseif (isset($m[9]) and strlen($m[9]))
+				$atts[] = stripcslashes($m[9]);
+			elseif (isset($m[11]))
+				$atts[] = stripcslashes($m[11]);
 		}
 	} else {
 		$atts = ltrim($text);
