删除元生成器 MSHTML

Removing meta generator 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 生成它?

或者其他一些摆脱它的方法?

正如@Remy Lebeau 所指出的,您无法控制此行为 AFAIK。但是,如果您愿意,也很容易摆脱它。

就我个人而言,我会使用正则表达式 (System.RegularExpressionsCore),它实现了 Perl 兼容正则表达式 (PCRE),它肯定出现在最近几个版本中,但我不知道它是什么时候引入的。

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

  <META[^<]*GENERATOR\s*> 

匹配以 并以 GENERATOR(零个或多个空格)> 结尾 您可以设置多行匹配和不区分大小写的选项。将 ReplaceString 设置为空字符串,然后您的代码(我使用 C++,因为您使用 C++ Builder 标记)将类似于:

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 正则表达式语法,你应该找到一些很好的资源,包括在线检查器来测试你的表达式是否符合你的预期。