unprotectSpecialChars($data, true); // need to get " converted back to " etc // Handle parameters one by one while (is_string($data) && false !== $pos = strpos($data, '=')) { $name = substr($data, 0, $pos); $name = ltrim($name, ', '); $name = trim($name); $value = ''; if (strlen($data) == $pos + 1) { break; } // Consider => if ($data[$pos + 1] == '>') { $pos++; } // Cut off the name part $data = substr($data, $pos + 1); $data = ltrim($data); if (! empty($data) && ($data[0] == '"' || $data[0] == "'")) { $quote_style = $data[0]; $quote = 0; // Parameter between quotes, find closing quote not escaped by a \ while (false !== $quote = strpos($data, $quote_style, $quote + 1)) { if ($data[$quote - 1] != "\\") { break; } } // Closing quote found if ($quote !== false) { $value = substr($data, 1, $quote - 1); $arguments[$name] = str_replace("\\$quote_style", $quote_style, $value); $data = substr($data, $quote + 1); continue; } // Not found, fallback as if opening quote was part of the string } // If last parameter, consider next as end of string if (preg_match("/[\s,]\w+=/", $data, $parts)) { $end = strpos($data, $parts[0]); $value = substr($data, 0, $end); $data = substr($data, $end); } else { $value = $data; $data = ''; } $value = rtrim($value, ', '); $arguments[$name] = $value; } return $arguments; } }