Jul 04

Сравнение двух страниц

В случае, когда вам нужно сравнить на идентичность 2 htm страницы, причем сравнить их по содержанию, а не по тегам, вы можете использовать приведенный ниже вариант решения задачи:..

Примечание: функция универсальная

Код:

...
private
function CutNotFuncCode(Param:TArrayOfTStrings4;
const Code:PChar; const NotSym : TSetOfSym;
const WriteElseText:boolean):String; overload;
function CutNotFuncCode(Code:PChar):string; overload;
...

...
function TMainForm.CutNotFuncCode(Code: PChar): string;
var
Param: TArrayOfTStrings4;
NotSym:TSetOfSym;
i:integer;
begin
NotSym:=[#$D,#$A,#9];

for i := 0 to 3 do
param[i]:= TStringList.Create;

with param[0] do
begin
add('"');
Add('{');
Add('<script');
add('<');
end;

with param[1] do
begin
add('"');
add('}');
add('</script>');
add('>')
end;

//param[2].add('"');
//param[3].Add('"');

Result:=PChar(CutNotFuncCode(Param,Code,NotSym,true));
end;

function TMainForm.CutNotFuncCode(Param: TArrayOfTStrings4; const Code: PChar;
const NotSym:TSetOfSym; const WriteElseText:boolean): String;

function Equality(SearchStr,InStr:PChar):boolean;
var
I:integer;
begin
result:=false;
for I := 0 to length(SearchStr)-1 do
if SearchStr[i]<>InStr[i] then exit;
result:=true;
end;

var
i,j:integer;
expected:array [0..1] of integer;
code1:PChar;
ready:boolean;
begin
result:=''; ready:=true;
code1:=Code;
expected[0]:=0; expected[1]:=0;

while Code1^<>#0 do
begin

for J := 1 downto 0 do
begin

if ((j=1) and (expected[0]=0)) or ((j=0) and (expected[1]=0)) then
if expected[j]=0 then
begin
for I := 0 to Param[j*2].Count-1 do
if Equality(PChar(Param[j*2].Strings[i]),code1) then
begin
expected[j]:=i+1;
inc(Code1,Length(Param[j*2].Strings[i]));
Continue;
end;
end
else
if expected[j]>0 then
if Equality(PChar(Param[j*2+1].Strings[expected[j]-1]),code1) then
begin
inc(Code1,Length(Param[j*2+1].Strings[expected[j]-1])-1);
expected[j]:=0;
ready:=false;
continue;
end;

end;

if ready and (expected[0]=0) and (not(Code1^ in NotSym))
then if WriteElseText then result:=result+Code1^
else if expected[1]<>0 then result:=result+Code1^;

ready:=true;
inc(code1);
end;
end;

procedure TMainForm.StartButtonClick(Sender: TObject);
begin

if CutNotFuncCode(PChar(RichEdit1.Text))=CutNotFuncCode(PChar(RichEdit2.Text)) then
ResultLabel.Caption:= 'Страницы одинаковые'
else
ResultLabel.Caption:= 'Страницы отличаются';
end;

end.

Прога довольно шустрая, благодаря использованию PChar и избежания Copy.

Вообще то, данная функция сначала предназначалась для вирезания не функционального кода.

param[0] - содержит набор строк, начиная с которых идет вирезание
param[1] - заканчивает вирезание
param[2] - содержит набор строк,  начиная с которых текст не проверяется, а просто копируется
param[3] - заканчивает безпроверочную зону текста

code - текст для обработки (PChar)
NotSym - набор (Set) символов, кот орые вырезаются в любом случае.
WriteElseText - указывает что делать с текстом, который не находится между "тегами" param[0] и param[1] и еще param[2] и param[3] (в случае если true, оставлять,  если false - вирезать.

Приведем пример:
параметры

Код:
function TMainForm.CutNotFuncCode(Code: PChar): string;
var
Param: TArrayOfTStrings4;
NotSym:TSetOfSym;
i:integer;
begin
NotSym:=[#$D,#$A,#9];

for i := 0 to 3 do
param[i]:= TStringList.Create;

param[0].Add('{');
param[1].add('}');
param[2].add('"');
param[3].Add('"');

Result:=PChar(CutNotFuncCode(Param,Code,NotSym,true));
end;

в этом случае при передвании текста
"123{456}
123"456"
123"{456}"
123{"456"}"
вернет
"123123456123{456}123"

Спонсор поста: Вы являетесь активным вебмастером и ищете самые надежные и прибыльные партнерки в интернете? Блог про заработок seo-bloggins.ru, не только поможет Вам выбрать наилучшие партнерские программы, но и даст возможность больше узнать о бизнесе и финансах, а также работе на дому!


Поделитесь вашими мыслями

Поддерживаемые теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>