Aunque sea en plan chapucero ya lo he solucionado, ahora es casi instantaneo, ya solo falta limpiar todo lo que sobra, creo que se podrian quitar los memos, (pero no se como trabajar por lineas en un string):
El problema estaba en usar un memo linea por linea en el StringReplace en vez de usar el memo.Lines.text, usando un String como ya habiais dicho muchos la carga es practicamente instantanea.
Código PHP:
var ind,tt:integer;
begin
//cargo la web en un memo
memo1.Lines.Text:=idHttp1.Get('http://www.aemet.es/es/eltiempo/prediccion/localidades?l=22001');
for ind := 0 to Memo1.Lines.count do
begin
if Memo1.Lines[ind]='<h2 class="titulo">' then
begin
for tt := ind to Memo1.Lines.count do
begin
memo2.Lines.Add(Memo1.Lines[tt]);
if Memo1.Lines[tt]=' <form name="frmMunicipio" method="get" action="/es/eltiempo/prediccion/localidades">' then
begin
memo2.lines[0]:= '<link rel="stylesheet" type="text/css" media="screen" href="http://www.aemet.es/css/estilos.css" /><h2 class="titulo">';
memo2.Lines.text:= StringReplace( memo2.Lines.text,'/imagenes/','http://www.aemet.es/imagenes/',[rfReplaceAll]);
wb1.LoadFromStrings(Memo2.lines);
exit
end;
end;
end;
end;
end;