Когда-то я использовал действительно странный код для экранирования URL, но держу пари, что это можно сделать лучше, более того, это пока не распространяется на html specialchars, оно просто использовалось для сохранения URL в базе данных.
function escapeUrl(&$url){
$matches = parse_url($url);
if(!isset($matches["host"])){
Utils_Logging_Logger::getLogger()->log(
"Unknown host for URL: \"$url\".",
Utils_Logging_Logger::TYPE_ERROR
);
$matches["host"] = "";
}
if(!isset($matches["scheme"])){
Utils_Logging_Logger::getLogger()->log(
"Sheme (like http://) for URL: \"$url\" was not set.",
Utils_Logging_Logger::TYPE_LOG);
$url = "http://";
}else{$url = $matches["scheme"]."://";}
$url.=$matches["host"];
if(isset($matches["path"])){
$path = rawurldecode($matches["path"]);
$url.=$path;
}
if(isset($matches["query"])){
$query = rawurldecode($matches["query"]);
$url.="?".$query;
}
return $url;
}