delphi html解析函数,是否有用于转义HTML的Delphi标准函数?

9 个答案:

答案 0 :(得分:18)

我99%确定RTL中不存在这样的功能(从Delphi 2009开始)。当然 - 然而 - 编写这样的函数是微不足道的。

更新 强>

您正在寻找HTTPUtil.HTMLEscape:

function HTMLEscape(const Str: string): string;

我不敢在这里发布代码(可能是版权侵犯),但例程非常简单。它将“&lt;”,“&gt;”,“&amp;”和“”“编码为<,>,&和"。它还取代了字符#92,#160 ..#255到十进制代码,例如\。

如果文件是UTF-8,则后一步是不必要的,也是不合逻辑的,因为较高的特殊字符(如∮)保持不变,而较低的特殊字符(如×)则被编码。

更新2

为了回应Stijn Sanders的回答,我做了一个简单的性能测试。

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 + '"';

else

result := result + Data[i];

end;

end;

function HTMLEncode2(Data: string):string;

begin

Result:=

StringReplace(

StringReplace(

StringReplace(

StringReplace(

Data,

'&','&',[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.

输出

532031

801969

答案 1 :(得分:13)

这似乎是一场小型比赛:)这是另外一个实现:

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('"');

else

result[iPos] := Data[i];

Inc(iPos);

end;

SetLength(result, iPos - 1);

end;

更新1:最初更新提供了错误的代码。

更新2:时间:

HTMLEncode : 2286508597

HTMLEncode2: 3577001647

HTMLEncode3: 361039770

答案 2 :(得分:3)

我通常只使用这段代码:

function HTMLEncode(Data:string):string;

begin

Result:=

StringReplace(

StringReplace(

StringReplace(

StringReplace(

StringReplace(

Data,

'&','&',[rfReplaceAll]),

'

'>','>',[rfReplaceAll]),

'"','"',[rfReplaceAll]),

#13#10,'
'#13#10,[rfReplaceAll]);

end;

答案 3 :(得分:2)

单元HTTPApp有一个名为HTMLEncode的函数。它还有其他与HTML / HTTP相关的功能。

答案 4 :(得分:1)

对于较旧的delphi版本,从Soap.HTTPUtil单元或仅HTTPUtil单元中,您可以使用

function HTMLEscape(const Str: string): string;

var

i: Integer;

begin

Result := '';

for i := Low(Str) to High(Str) do

begin

case Str[i] of

'

'>' : Result := Result + '>'; { Do not localize }

'&' : Result := Result + '&'; { Do not localize }

'"' : Result := Result + '"'; { Do not localize }

{$IFNDEF UNICODE}

#92, Char(160) .. #255 : Result := Result + '' + IntToStr(Ord(Str[ i ])) +';'; { Do not localize }

{$ELSE}

// NOTE: Not very efficient

#$0080..#$FFFF : Result := Result + '' + IntToStr(Ord(Str[ i ])) +';'; { Do not localize }

{$ENDIF}

else

Result := Result + Str[i];

end;

end;

end;

答案 5 :(得分:1)

答案 6 :(得分:0)

在delphi中,您具有功能

THTMLEncoding.HTML.Encode

答案 7 :(得分:0)

我的函数将for循环与字符串的最小重新分配结合起来:

function HtmlEncode(const Value: string): string;

var

i: Integer;

begin

Result := Value;

i := 1;

while i <= Length(Result) do

begin

if Result[i] = '

begin

Result[i] := '&';

Insert('lt;', Result, i + 1);

Inc(i, 4);

end

else if Result[i] = '>' then

begin

Result[i] := '&';

Insert('gt;', Result, i + 1);

Inc(i, 4);

end

else if Result[i] = '"' then

begin

Result[i] := '&';

Insert('quot;', Result, i + 1);

Inc(i, 6);

end

else if Result[i] = '&' then

begin

Insert('amp;', Result, i + 1);

Inc(i, 5);

end

else

Inc(i);

end;

end;

答案 8 :(得分:0)

如何替换特殊字符:

function HtmlWeg(sS: String): String;

var

ix,cc: Integer;

sC, sR: String;

begin

result := sS;

ix := pos('\u00',sS);

while ix >0 do

begin

sc := copy(sS,ix+4,2) ;

cc := StrtoIntdef('$' +sC,32);

sR := '' + chr(cc);

sS := Stringreplace(sS, '\u00'+sC,sR,[rfreplaceall]) ;

ix := pos('\u00',sS);

end;

result := sS;

end;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值