В идеальном сценарии URL-адреса, переданные в запросе, будут закодированы в URL-адресе, а не в кодировке HTML.
В вашем случае вы могли бы вручную заменить все &
на что-то временное, а затем замените их все обратно после анализа URL-адреса. Это не совсем красиво, но работает:
$url = str_replace('&', '__TEMP__', $url);
$parts = parse_url($url);
parse_str($parts['query'], $query);
$urlParam = str_replace('__TEMP__', '&', $query['url']);
echo $urlParam;
Демо