Saltar al contenido

¿Existe una función estándar de Delphi para escapar de HTML?

Contamos con tu ayuda para difundir nuestros posts referente a las ciencias informáticas.

Solución:

Estoy 99 % seguro de que tal función no existe en RTL (a partir de Delphi 2009). Por supuesto, sin embargo, es trivial escribir tal función.

Actualizar

HTTPUtil.HTMLEscape es lo que estás buscando:

function HTMLEscape(const Str: string): string;

No me atrevo a publicar el código aquí (violación de derechos de autor, probablemente), pero la rutina es muy simple. Codifica “<", ">“, “&”, y para <, >, &y ". También reemplaza los caracteres #92, #160..#255 a códigos decimales, por ejemplo \.

Este último paso no es necesario si el archivo es UTF-8, y también es ilógico, porque los caracteres especiales superiores, como ∮, se dejan como están, mientras que los caracteres especiales inferiores, como ×, están codificados.

Actualización 2

En respuesta a la respuesta de Stijn Sanders, realicé una prueba de rendimiento simple.

program Project1;

$APPTYPE CONSOLE

uses
  Windows, SysUtils;

var
  t1, t2, t3, t4: Int64;
  i: Integer;
  str: string;
const
  N = 100000;


function HTMLEncode(const Data: string): string;
var
  i: Integer;
begin

  result := '';
  for i := 1 to length(Data) do
    case Data[i] of
      '<': result := result + '<';
      '>': result := result + '>';
      '&': result := result + '&';
      '"': result := result + '"';
    else
      result := result + Data[i];
    end;

end;

function HTMLEncode2(Data: string):string;
begin
  Result:=
    StringReplace(
    StringReplace(
    StringReplace(
    StringReplace(
      Data,
      '&','&',[rfReplaceAll]),
      '<','<',[rfReplaceAll]),
      '>','>',[rfReplaceAll]),
      '"','"',[rfReplaceAll]);
end;

begin

  QueryPerformanceCounter(t1);
  for i := 0 to N - 1 do
    str := HTMLEncode('Testing. Is 3*4<3+4? Do you like "A & B"');
  QueryPerformanceCounter(t2);

  QueryPerformanceCounter(t3);
  for i := 0 to N - 1 do
    str := HTMLEncode2('Testing. Is 3*4<3+4? Do you like "A & B"');
  QueryPerformanceCounter(t4);

  Writeln(IntToStr(t2-t1));
  Writeln(IntToStr(t4-t3));

  Readln;


end.

la salida es

532031
801969

Parece que aquí hay un pequeño concurso 🙂 Aquí hay una implementación más:

function HTMLEncode3(const Data: string): string;
var
  iPos, i: Integer;

  procedure Encode(const AStr: String);
  begin
    Move(AStr[1], result[iPos], Length(AStr) * SizeOf(Char));
    Inc(iPos, Length(AStr));
  end;

begin
  SetLength(result, Length(Data) * 6);
  iPos := 1;
  for i := 1 to length(Data) do
    case Data[i] of
      '<': Encode('<');
      '>': Encode('>');
      '&': Encode('&');
      '"': Encode('"');
    else
      result[iPos] := Data[i];
      Inc(iPos);
    end;
  SetLength(result, iPos - 1);
end;

Actualización 1: se actualizó el código incorrecto proporcionado inicialmente.

Actualización 2: Y los tiempos:

HTMLEncode :   2286508597
HTMLEncode2:   3577001647
HTMLEncode3:    361039770

Usualmente solo uso este código:

function HTMLEncode(Data:string):string;
begin
  Result:=
    StringReplace(
    StringReplace(
    StringReplace(
    StringReplace(
    StringReplace(
      Data,
      '&','&',[rfReplaceAll]),
      '<','<',[rfReplaceAll]),
      '>','>',[rfReplaceAll]),
      '"','"',[rfReplaceAll]),
      #13#10,'
'#13#10,[rfReplaceAll]); end;

(¿derechos de autor? es de código abierto)

Calificaciones y comentarios

Si te gustó nuestro trabajo, puedes dejar una sección acerca de qué te ha gustado de esta noticia.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *