删除元生成器MSHTML

时间:2019-05-16 15:42:01

标签: delphi webbrowser-control c++builder mshtml

例如,当我阅读使用TWebBrowser(设计模式)使用以下代码生成的HTML页面的内容时:

function GetHTML(w: TWebBrowser): String;
Var
  e: IHTMLElement;
begin
  Result := '';
  if Assigned(w.Document) then
  begin
     e := (w.Document as IHTMLDocument2).body;

     while e.parentElement <> nil do
     begin
       e := e.parentElement;
     end;

     Result := e.outerHTML;
  end;
end;

它在</HEAD>之前添加META标签,例如:

<META content="MSHTML 6.00.2900.2180" name=GENERATOR>

或...

<META name=GENERATOR content="MSHTML 11.00.10570.1001">

读取outerHTML时是否有摆脱标签的方法?

还是首先阻止MSHTML生成它?

还是其他一些摆脱它的方法?

1 个答案:

答案 0 :(得分:1)

正如@Remy Lebeau指出的那样,您无法通过AFAIK控制此行为。但是,如果需要,可以轻松摆脱它。

我个人会使用实现Perl兼容正则表达式(PCRE)的正则表达式(System.RegularExpressionsCore),后者肯定存在于最后几个版本中,但我不知道它何时引入。

您将要使用类似以下内容的RegEx设置:

  <META[^<]*GENERATOR\s*> 
匹配所有以字符串中没有任何>并以GENERATOR(零个或多个空格)结尾。>您可以设置多行和不区分大小写匹配的选项。将ReplaceString设置为空字符串,然后您的代码(我在使用C ++ Builder标记时使用了C ++)将类似于:

TPerlRegEx     * pRegEx;

  pRegEx=new TPerlRegEx();
  pRegEx->Replacement=UnicodeString(L"");
  pRegEx->RegEx=UnicodeString(L"<META[^>]*GENERATOR\\s*>");
  pRegEx->Options=TPerlRegExOptions() << preCaseLess << pre MultiLine;
  pRegEx->Subject=szOuterHTML;
  pRegEx->ReplaceAll();
  delete(pRegEx);

当然,还有其他方法可以做到这一点,例如使用XML节点解析器并删除该节点,但是我认为RegEx简洁明了。这是处理文本文件的好工具。

如果您使用Google正则表达式语法,则应该找到一些不错的资源,包括在线检查器,以测试您的表达式是否按照您的预期进行。